使用协程对LiveData值进行单元测试

时间:2020-01-21 14:39:52

标签: android mockito android-lifecycle android-testing coroutine

我想测试viewmodel的变量是否具有存储库调用的返回值。这是我第一次使用协程。

这里的问题是我的事件变量在这里返回null:

Assert.assertEquals(viewModel.event.getOrAwaitValue(),EventGame(games = games))

我的viewModel:

class GamesViewModel(private val repository: GameRepository) : ViewModel(), CoroutineScope {
    override val coroutineContext: CoroutineContext =
        Dispatchers.Main + SupervisorJob()

    private val _event = MutableLiveData<EventGame>()
    val event: LiveData<EventGame> get() = _event


    fun listGames() = this.launch {
        val ej = withContext(Dispatchers.Default) {
            repository.listGames()
        }
        _event.postValue(ej)
    }
}

我的单元测试课

class GamesUnitTest : KoinTest{
    lateinit var viewModel: GameViewModel

    private val g1 = Game(id = 1, data = "01/01/2020 18:35" ...)
    private val g2 = Game(id = 2, data = "01/10/2020 18:35"...)
    private val games = listOf(g1, g2)

    @Mock
    lateinit var repository: GameRepository

    @get:Rule
    var coroutinesTestRule = CoroutinesTestRule()

    @get:Rule
    val instantExecutorRule = InstantTaskExecutorRule()

    @Mock
    lateinit var observer: Observer<EventGame>

    @After
    fun after() {
        stopKoin()
    }

    @Before
    fun before() {
        MockitoAnnotations.initMocks(this)
        viewModel = GameViewModel(repository)
    }

    @Test
    fun testListOfGames() = runBlockingTest{
        Mockito.`when`(repository.listGames()).thenReturn(EventGame(games = games))
        viewModel.event.observeForever(observer)
        viewModel.listGames()
        Assert.assertEquals(viewModel.event.getOrAwaitValue(), EventGame(games = games))

    }
}

-Edit2

我删除了GlobalScope.launch {}。该事件仍然为空

我不确定该如何解决。

1 个答案:

答案 0 :(得分:0)

我的问题出在我的Mockito中。它返回null。 当我使用Mockito-Kotlin时,效果很好。

来源:Mocked suspend function returns null in Mockito