首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android Mockito-Kotlin错误--“实际上,与这个模拟没有任何交互”

Android Mockito-Kotlin错误--“实际上,与这个模拟没有任何交互”
EN

Stack Overflow用户
提问于 2020-01-28 17:29:59
回答 1查看 732关注 0票数 2

下面是我的ViewModel类的测试代码。我的应用架构是基于MVI的。基本上,我是在嘲弄我的回购和国家课程。在下面编写的测试函数中,当我成功地从API加载新闻列表时,我试图检查状态是否按正确的顺序更改。

代码语言:javascript
复制
class NewsListViewModelTest {
    //...

    @get:Rule
    val testSchedulerRule = RxTestSchedulerRule()

    private lateinit var testSubject: NewsListViewModel    

    private val loadingState = NewsListState(state = State.LOADING)

    private val newsRepo = mock<NewsRepository>()
    private val observer = mock<Observer<NewsListState>>()

    @Before
    fun setUp() {
        testSubject = NewsListViewModel(newsRepo)
        testSubject.observableState.observeForever(observer)
    }

    @Test
    fun `Given news list successfully loaded, when action LoadNewsList is received, then state contains news list`() {
        // GIVEN
        val newsList = listOf(News("title", "description", Date(), "image"))
        val successState = NewsListState(newsList = newsList, state = State.DATA)

        whenever(newsRepo.loadAll("keyword", 1, 1))
            .thenReturn(Observable.just(newsList))

        // WHEN
        testSubject.dispatch(NewsListAction.LoadNewsList("keyword"))
        testSchedulerRule.triggerActions()

        // THEN
        inOrder(observer) {
            verify(observer).onChanged(loadingState)
            verify(observer).onChanged(successState)
        }
        verifyNoMoreInteractions(observer)
    }
}

然而,当我运行这个测试时,我在inOrder(observer){ ... }中的第一行中得到了以下错误

代码语言:javascript
复制
Wanted but not invoked:
observer.onChanged(
    NewsListState(newsList=[], state=LOADING, errorMessage=)
);
-> at [packagename].NewsListViewModelTest.Given news list failed to load, when action LoadNewsList is received, then state contains error(NewsListViewModelTest.kt:77)
Actually, there were zero interactions with this mock.

这些是我的测试依赖:

代码语言:javascript
复制
testImplementation 'junit:junit:4.12'
testImplementation 'androidx.arch.core:core-testing:2.1.0'
testImplementation 'com.nhaarman.mockitokotlin2:mockito-kotlin:2.2.0'

这一错误的原因可能是什么?

编辑-我的RxTestSchedulerRule课程:

代码语言:javascript
复制
class RxTestSchedulerRule(private val testScheduler: TestScheduler = TestScheduler()) : Scheduler(),
    TestRule {
    override fun apply(base: Statement, description: Description?): Statement {
        RxJavaPlugins.setIoSchedulerHandler { testScheduler }
        RxJavaPlugins.setComputationSchedulerHandler { testScheduler }
        RxJavaPlugins.setNewThreadSchedulerHandler { testScheduler }
        RxJavaPlugins.setSingleSchedulerHandler { testScheduler }
        RxAndroidPlugins.setInitMainThreadSchedulerHandler { Schedulers.trampoline() }
        return base
    }

    override fun createWorker() = testScheduler.createWorker()

    fun triggerActions() = testScheduler.triggerActions()
}

编辑2 --我的调度功能:

代码语言:javascript
复制
fun dispatch(?) {
     newsRepository.loadAll(keyword = it.keyword, 
                            pageSize = pageSize, 
                            page = page)
                   .subscribeOn(Schedulers.io()) 
                   .map<NewsListChange> { newsList -> 
                         NewsListChange.Data(newsList) } 
                  .defaultIfEmpty(NewsListChange.Data(emptyList())) 
                  .onErrorReturn { throwable -> 
                       NewsListChange.Error(throwable) } 
                  .startWith(NewsListChange.Loading)
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-30 20:04:00

请试一试而不是这一行

代码语言:javascript
复制
whenever(newsRepo.loadAll("keyword", 1, 1))
            .thenReturn(Observable.just(newsList))

代码语言:javascript
复制
whenever(newsRepo.loadAll(anyString(), anyInt(), anyInt()))
            .thenReturn(Observable.just(newsList))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59954140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档