有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Mocikto如何正确验证模拟调用

我不熟悉kotlin单元测试,并尝试使用Mockito进行相同的测试

private val mockClient: MongoClient = Mockito.mock(MongoClient::class.java)
private val mockDatabase: MongoDatabase = Mockito.mock(MongoDatabase::class.java)
private val mockCollection: MongoCollection<Document> =
        Mockito.mock(MongoCollection::class.java, RETURNS_DEEP_STUBS) as MongoCollection<Document>

private val dao = MyDao(mockClient)

测试从mongo获取数据的dao的get方法时,使用whenthen return

val query = BasicDBObject("_id", someId)
Mockito.`when`(mockClient.getDatabase(DB_NAME)).thenReturn(mockDatabase)
Mockito.`when`(mockDatabase.getCollection(COLLECTION_NAME))
    .thenReturn(mockCollection)
Mockito.`when`(mockCollection.find(query)).thenReturn(iterable)
Mockito.`when`(iterable.iterator()).thenReturn(cursor)
Mockito.`when`(cursor.hasNext()).thenReturn(true).thenReturn(false)
Mockito.`when`(cursor.next()).thenReturn(validDocument)
assertEquals(expectedData, dao.get(someId))

在插入期间验证模拟调用时会出现问题

Mockito.verify(mockCollection, Mockito.times(1)).insertOne(dataDocument)
dao.create(data)

错误是

Wanted but not invoked:
mongoCollection.insertOne({//documents goes here})

我试着直接使用API并将其插入正确的数据中,问题在于测试不确定我是否正确使用了verify? 任何建议都将不胜感激


共 (1) 个答案

  1. # 1 楼答案

    verify()应该在测试用例结束时调用(就像断言语句一样)。尝试在create()之后调用verify()

    另外,我建议你用MockK表示Kotlin。它看起来更加地道,用户友好