我成功地进行了一些对异步函数的测试,仅使用一个回调界面作为参数使用Mockito-Kotlin库,但是当我尝试使用其他参数(如字符串或整数(进行同一函数进行测试时我收到错误:
org.mockito.exceptions.misusing.invaliduseofmatchersexception:
对参数匹配者的使用无效!
2个匹配项,有1个记录:
- >在com.example.presentation.presenter.mycollectionpresentertest.getcomiclistbyherook(mycollectionpresentertest.kt:97(
如果将匹配器与原始值结合在一起,则可能发生此例外:
//不正确:
somemethod(AnyObject((
使用匹配器时,所有参数都必须由匹配者提供。
例如:
//正确:
somemethod(AnyObject((,eq(matcher fy Matcher&quot'((;
有关更多信息,请参见Matchers类的Javadoc。
我确定我会用任何((嘲笑正确回调接口,但是我不知道我是否正确嘲笑整数参数。我尝试使用any()
,anyInt()
,eq(1)
和any() as Int
,但总是相同的错误。
这是我要测试的课程:
@PerFragment
class MyCollectionPresenter @Inject constructor(private val useCase: GetComicListByHeroUseCase) {
@Inject
lateinit var view: MyCollectionView
lateinit var models: List<ComicModel>
fun getComicListByHero(heroId: Int) {
useCase.execute(heroId, object : HeroUseCase.GetComicListByHeroCallback {
override fun onComicListReceived(comicList: List<Comic>) {
models = ComicModelMapper.toModel(comicList)
view.setItems(models)
}
override fun onError() {
view.showMessage()
}
})
}
}
这是测试类:
class MyCollectionPresenterTest : UnitTest() {
private lateinit var presenter: MyCollectionPresenter
@Mock
private lateinit var useCase: GetComicListByHeroUseCase
@Mock
private lateinit var view: MyCollectionView
@Before
fun setUp() {
presenter = MyCollectionPresenter(useCase)
initializeView()
}
@Test
fun getComicListByHeroOK() {
setupGetComicsCallbackOK()
presenter.getComicListByHero(any())
verify(presenter.view).setItems(emptyList())
}
@Test
fun getComicListByHeroError() {
setupGetComicsCallbackError()
presenter.getComicListByHero(any())
verify(presenter.view).showMessage()
}
private fun initializeView() {
presenter.view = view
}
private fun setupGetComicsCallbackError() {
doAnswer {
val callback = it.arguments[0] as HeroUseCase.GetComicListByHeroCallback
callback.onError()
null
}.`when`(useCase).execute(any(), any())
}
private fun setupGetComicsCallbackOK() {
doAnswer {
val callback = it.arguments[0] as HeroUseCase.GetComicListByHeroCallback
callback.onComicListReceived(emptyList())
null
}.`when`(useCase).execute(any(), any())
}
}
这是基本单元测试类:
@RunWith(MockitoJUnitRunner::class)
abstract class UnitTest {
@Suppress("LeakingThis")
@Rule
@JvmField
val injectMocks = InjectMocksRule.create(this@UnitTest)
}
这是注射模拟规则的类:
class InjectMocksRule {
companion object {
fun create(testClass: Any) = TestRule { statement, _ ->
MockitoAnnotations.initMocks(testClass)
statement
}
}
}
非常感谢您的帮助并原谅我的英语。
问候!
更新:我找到了解决方案并以答案发布。
最后,我知道我在做什么错。首先,it.argument[1]
,因为回调是我要模拟答案的函数的第二个参数。
另一件事是我要测试presenter.getComicListByHero(1)
的功能的参数。
这是修订的代码:
@Test
fun getComicListByHeroError() {
setupGetComicsCallbackError()
presenter.getComicListByHero(1)
verify(presenter.view).showMessage()
}
private fun setupGetComicsCallbackError() {
doAnswer {
val callback = it.arguments[1] as HeroUseCase.GetComicListByHeroCallback
callback.onError()
null
}.`when`(useCase).execute(ArgumentMatchers.anyInt(), any())
}
非常感谢@voghdev的帮助