代码之家  ›  专栏  ›  技术社区  ›  yasin

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

  •  0
  • yasin  · 技术社区  · 5 年前

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

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

    Assert.eassertEquals(viewModel.events.getOrAwaitValue(),EventGame(游戏=游戏))

    我的视图模型:

    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{}。事件仍然为空

    我不知道该怎么解决。

    0 回复  |  直到 5 年前
        1
  •  0
  •   yasin    5 年前

    我的问题出在我的Mockito身上。它返回null。 当我使用Mockito Kotlin时,它工作得很好。

    来源: Mocked suspend function returns null in Mockito