Android 在协同路由上下文中运行mock方法会在kotlin中返回null
我想模拟一个服务的方法,但是这个方法是在不同的上下文中调用的,返回的值是null(dp.search是一个挂起函数)。看看我的代码:Android 在协同路由上下文中运行mock方法会在kotlin中返回null,android,unit-testing,kotlin,mockito,kotlin-coroutines,Android,Unit Testing,Kotlin,Mockito,Kotlin Coroutines,我想模拟一个服务的方法,但是这个方法是在不同的上下文中调用的,返回的值是null(dp.search是一个挂起函数)。看看我的代码: @Test fun `testing mocked method in coroutine`() = testScope.runBlockingTest { val dp = Mockito.mock(DataProvider::class.java) Mockito.`when`(dp.search("Any"))
@Test
fun `testing mocked method in coroutine`() = testScope.runBlockingTest {
val dp = Mockito.mock(DataProvider::class.java)
Mockito.`when`(dp.search("Any")).thenReturn(listOf())
val data = withContext(Dispatchers.Unconfined) { dp.search("Any")}
// but data is null
Assert.assertEquals(0, data.size)
}
尝试检查以下两种情况:
首先不要使用dispatcher!只是调用挂起函数
@Test
fun `testing mocked method in coroutine`() = testScope.runBlockingTest {
val dp = Mockito.mock(DataProvider::class.java)
Mockito.`when`(dp.search("Any")).thenReturn(listOf())
val data = dp.search("Any")
// but data is correct
Assert.assertEquals(0, data.size)
}
而不是在定义好的上下文中进行模拟。(但这不是一个解决方案……只是为了检查mock是否有效)
我应该这样说:
@ExperimentalCoroutinesApi
val testDispatcher = TestCoroutineDispatcher()
val testScope = TestCoroutineScope(testDispatcher)
@ExperimentalCoroutinesApi
@Before
fun initialize() {
Dispatchers.setMain(testDispatcher)
MockitoAnnotations.initMocks(this)
}
@ExperimentalCoroutinesApi
@After
fun tearDown() {
Dispatchers.resetMain()
testScope.cleanupTestCoroutines()
}
您使用的是哪一个mockito版本?@sajad我尝试用mockito 3.0.0重现您的问题,这很好,您使用的是哪一个mockito版本?@sajad我尝试用mockito 3.0.0重现您的问题,这很好
@ExperimentalCoroutinesApi
val testDispatcher = TestCoroutineDispatcher()
val testScope = TestCoroutineScope(testDispatcher)
@ExperimentalCoroutinesApi
@Before
fun initialize() {
Dispatchers.setMain(testDispatcher)
MockitoAnnotations.initMocks(this)
}
@ExperimentalCoroutinesApi
@After
fun tearDown() {
Dispatchers.resetMain()
testScope.cleanupTestCoroutines()
}