Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在协同路由上下文中运行mock方法会在kotlin中返回null_Android_Unit Testing_Kotlin_Mockito_Kotlin Coroutines - Fatal编程技术网

Android 在协同路由上下文中运行mock方法会在kotlin中返回null

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"))

我想模拟一个服务的方法,但是这个方法是在不同的上下文中调用的,返回的值是null(dp.search是一个挂起函数)。看看我的代码:

    @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()

    }