Получение InvalidUseOfMatchersException при использовании метода заглушки - PullRequest
0 голосов
/ 29 февраля 2020

В моем проекте Android я использую mockito для проверки функции, которая преобразует QuerySnapshot в List<Entry>.

Это функция, которую я пытаюсь протестировать:

class EntriesMapper {

    fun map(querySnapshot: QuerySnapshot): List<Entry> {
        return querySnapshot.map { documentSnapshot ->
            Entry(documentSnapshot["id"] as String)
        }
    }
}

Это класс теста:

class EntriesMapperTest {
    @Test
    fun `map should convert query snapshot to entry`() {
        val id = 1
        val documentSnapshot = mock<DocumentSnapshot> {
            on { this.id } doReturn id
        }
        val querySnapshot = mock<QuerySnapshot>()
        val transform = any<(DocumentSnapshot) -> Entry>()
        whenever(querySnapshot.map(transform)).thenAnswer { answer ->
            (answer.arguments.first() as (DocumentSnapshot) -> Entry).invoke(documentSnapshot)
        }
        val testObject = EntriesMapper()

        val entries = testObject.map(querySnapshot)
        val entry = entries.first()

        assertThat(entry.id, equalTo(id))
    }
}

И это исключение:

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 
Invalid use of argument matchers!
0 matchers expected, 1 recorded:
-> at io.company.myapp.entries.EntriesMapperTest.map should convert query snapshot to entry(EntriesMapperTest.kt:147)

This exception may occur if matchers are combined with raw values:
    //incorrect:
    someMethod(anyObject(), "raw String");
When using matchers, all arguments have to be provided by matchers.
For example:
    //correct:
    someMethod(anyObject(), eq("String by matcher"));

Я знаю, что это очень распространенное исключение, которое вы получаете, когда комбинируете сопоставления с необработанными значениями, но, как вы можете видеть, я не передаю необработанные значения.

1 Ответ

0 голосов
/ 02 марта 2020

Причина, по которой я решил смоделировать QuerySnapshot, заключается в том, что его конструктор является закрытым, а заглушение функции карты с помощью mockito привело к большему количеству проблем, чем к решениям.

QuerySnapshot наследуется от Iterable, поэтому вместо использования mock Я бы рекомендовал использовать список.

class EntriesMapper {
    fun map(querySnapshot: Iterable<DocumentSnapshot>): List<Entry> {
        return querySnapshot.map { documentSnapshot ->
            Entry(documentSnapshot["id"] as String)
    }
}

Тестовый класс

class EntriesMapperTest {
    @Test
    fun `map should convert query snapshot to entry`() {
        val id = 1
        val documentSnapshot = mock<DocumentSnapshot> {
            on { this.id } doReturn id
        }
        val testObject = EntriesMapper()

        val entries = testObject.map(listOf(documentSnapshot))
        val entry = entries.first()

        assertThat(entry.id, equalTo(id))
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...