【发布时间】:2021-01-05 13:57:20
【问题描述】:
我是 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)
使用 when 和 thenReturn
测试从 mongo 获取数据的 dao 的 get 方法可以正常工作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 并正确插入数据,问题在于测试不确定我是否正确使用验证? 任何有帮助的建议表示赞赏。
【问题讨论】:
-
如何创建
dataDocument?也使用mockito-kotlin库。它有whenever而不是when和Mockito.mock(MongoClient::class.java)可以替换为reified即mock<MongoClient>() -
dataDocument 是一个实际的Mongo Document val dataDocument = Document() // 填写其他细节
-
我很长时间没有使用 mongo,但我的怀疑在于
Document类,它没有 equals/hashcode 方法,因此您的测试Document和实际服务 @987654334 @differ,这就是为什么 mockito 无法匹配,因为即使它们具有相同的值,它们也不相等。 -
dao.create(data)是做什么的?顺序正确吗?verify应该在测试用例结束时调用。如果dao. create(data)预计会执行insert操作,则更改方法调用的顺序。
标签: java unit-testing kotlin mocking mockito