【发布时间】:2020-05-07 15:42:36
【问题描述】:
我想测试viewmodel的变量是否有repository调用的返回值。这是我第一次使用协程。
这里的问题是我的事件变量在这里返回 null:
Assert.assertEquals(viewModel.event.getOrAwaitValue(), EventGame(games = games))
我的视图模型:
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))
}
}
--编辑2
我删除了 GlobalScope.launch{}。该事件仍然为空
我不知道如何解决这个问题。
【问题讨论】:
-
使用
GlobalScope.launch不是好习惯 -
@SaeedEntezari 我在教程中找到了这个。我应该使用什么?
-
@SaeedEntezari 删除了 GlobalScope.launch{} 但我仍然得到空值
标签: android mockito android-lifecycle android-testing coroutine