Android Mockito Kotlin错误-“;事实上,与此模拟的互动为零;

Android Mockito Kotlin错误-“;事实上,与此模拟的互动为零;,android,kotlin,mockito,android-testing,mockito-kotlin,Android,Kotlin,Mockito,Android Testing,Mockito Kotlin,下面是我的ViewModel类的测试代码。我的应用程序架构基于MVI。基本上,我试图模仿我的回购协议和状态类。在下面编写的测试函数中,我试图检查当我成功地从API加载新闻列表时,状态是否以正确的顺序更改 class NewsListViewModelTest { //... @get:Rule val testSchedulerRule = RxTestSchedulerRule() private lateinit var testSubject: News

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

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)
    }
}
这些是我的测试依赖项:

testImplementation 'junit:junit:4.12'
testImplementation 'androidx.arch.core:core-testing:2.1.0'
testImplementation 'com.nhaarman.mockitokotlin2:mockito-kotlin:2.2.0'
这个错误的原因可能是什么

编辑--My
RxTestSchedulerRule
类:

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——我的分派功能:

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)
}
fun调度(?){
newsRepository.loadAll(关键字=it.keyword,
pageSize=pageSize,
第页=第页)
.subscribeOn(Schedulers.io())
.map{newsList->
NewsListChange.Data(新闻列表)}
.defaultIfEmpty(NewsListChange.Data(emptyList()))
.onErrorReturn{可丢弃->
NewsListChange.Error(可丢弃)}
.startWith(NewsListChange.Loading)
}

请尝试,不要使用此行

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


您需要使用IDE调试器逐行调试代码,并查看为什么不调用观察者。@Wojtek我调试了代码。代码运行在以下行之后未继续:
.subscribeOn(Schedulers.io())
。我还在上面添加了我的测试计划程序规则类。你能显示你的分派方法吗?看起来你在模拟中发送了3个参数,但在模拟调用中只有1个参数,你能更正这些参数吗?
whenever(newsRepo.loadAll("keyword", 1, 1))
            .thenReturn(Observable.just(newsList))
whenever(newsRepo.loadAll(anyString(), anyInt(), anyInt()))
            .thenReturn(Observable.just(newsList))