android - 无法运行 2 个连续的测试(需要但未调用实际上,与此模拟的交互为零)

标签 android mocking mockito viewmodel

这里实际上有几个类似的问题,但我已经尝试了所有的建议,但仍然面临这个问题。

Wanted but not invoked:
observer.onChanged(<Repo matcher>);
-> at xxx.RepoViewModelTest.testRepoList(RepoViewModelTest.kt:51)
Actually, there were zero interactions with this mock.

class RepoViewModelTest {
    @get:Rule var instantTaskExecutorRule = InstantTaskExecutorRule()
    @Mock private lateinit var observer: Observer<DataWrapper<List<Repo>>>
    @Mock private lateinit var repoRepository: RepoRepository
    private lateinit var repoViewModel: RepoViewModel

    @Before
    fun setup() {
        MockitoAnnotations.initMocks(this)
        repoViewModel = RepoViewModel(RepoUseCase(repoRepository))
    }

    @Test
    fun testError() {
        `when`(repoRepository.getRepos("mine"))
            .thenReturn(Observable.error(Exception("No internet")))
        repoViewModel.observeRepos().observeForever(observer)
        repoViewModel.getRepos("mine")    
        verify(observer).onChanged(
            argThat(RepoMatcher(DataWrapper(Exception("No internet")))))
    }

    @Test
    fun testRepoList() {
        val listIn = listOf(Repo("Repo1"), Repo("Repo2"))
        `when`(repoRepository.getRepos("mine"))
            .thenReturn(Observable.just(listIn))
        repoViewModel.observeRepos().observeForever(observer)
        repoViewModel.getRepos("mine")
        val listOut = listOf(Repo("Repo1"), Repo("Repo2"))
        verify(observer)
            .onChanged(argThat(RepoMatcher(DataWrapper(listOut))))
    }
}

我可以单独运行每个测试,但不能运行整个套件。 我尝试在每次测试后重置模拟,为每个测试创建一个观察者,或者在每个测试中实例化每个模拟对象,没有骰子。

在 Android Studio 3.2.1 中运行测试,在 app/xxx/test 下

模仿 2.8.47

Java 1.8.0_191

最佳答案

可能你需要这样的东西

@BeforeClass
public static void setupClass() {
    RxAndroidPlugins.setInitMainThreadSchedulerHandler(__ -> Schedulers.trampoline());
}

关于android - 无法运行 2 个连续的测试(需要但未调用实际上,与此模拟的交互为零),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53798783/

相关文章:

安卓命令行测试

android - AlertDialog 弹出两次

java - JUNIT Autowired 实例始终为 null

android - 使用mockito测试void方法

android - Xamarin.Android 绑定(bind)使用 EnumMethods.xml 定义 Getter/Setter 方法作为接口(interface)

android - 如何像whatsapp一样选择位置?

google-chrome - 在 Chrome 上持续模拟 GPS 位置

java - 有哪些方法可以测试依赖于静态方法的方法?

python - 在 Python 中使用模拟测试派生类

java - 对于模拟对象,Mockito 休息模板始终为空