在存根方法时获取InvalidUseOfMatchersException



我在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"));

我知道这是一个非常常见的异常,当你将匹配器与原始值相结合时,但正如你所看到的,我没有传递原始值。

我之所以决定模拟QuerySnapshot,是因为它的构造函数是私有的,用mockito去掉map函数最终会带来更多的问题而不是解决方案。

QuerySnapshot继承自Iterable,因此我建议使用List而不是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))
}
}

最新更新