Mockito与Kotlin测试异步失败

时间:2017-03-26 11:20:20

标签: unit-testing mockito kotlin

我正在尝试为我的测试学习Mockito但是在使用Kotlin时它更复杂。我想在我的演示者中测试一个函数,该函数在被调用时异步从存储库中获取对象列表并从侦听器触发onSuccess / onError。之后,演示者告诉视图根据回调做任何需要的事情。

这是测试代码:

<iframe id="iframe" src="about:blank" name="w iframe">
</iframe>

这是经过测试的代码:

@Mock
lateinit var view: CategoriesActivityContract.View

@Mock
lateinit var repository: CategoriesRepository

@Before
fun setUp() {
    MockitoAnnotations.initMocks(this)
}

@Test
fun shouldPassCategoriesToView2() {
    `doAnswer`({
        it: InvocationOnMock? ->
        (it!!.arguments[0] as CategoriesRepository.OnGetCategoriesListener).onSuccess(DUMMY_CATEGORIES)
        null
    }).`when`(repository).getCategoriesAsync(any(CategoriesRepository.OnGetCategoriesListener::class.java))


    val presenter: CategoriesActivityPresenter = CategoriesActivityPresenter(repository)
    presenter.bindView(view)
    presenter.loadCategories()


    `verify`(view).displayCategories(DUMMY_CATEGORIES)
}

测试失败并显示以下错误消息:

override fun loadCategories() {
    repository.getCategoriesAsync(object: CategoriesRepository.OnGetCategoriesListener {
        override fun onSuccess(categories: List<Category>) {
            if (!categories.isEmpty()) {
                view?.displayCategories(categories)
            } else {
                view?.displayNoCategoriesError()
            }
        }

        override fun onError(message: String?) {
            view?.displayNoCategoriesError()
        }
    })
}

1 个答案:

答案 0 :(得分:3)

Mockito.any(Class<T>)返回null[1][2]),getCategoriesAsync方法不接受此内容。
您可以使用Mockito-Kotlin库,它不会返回空值&#39;克服这个问题。