在其中一个是回调接口时,嘲笑函数上的另一个参数不起作用



我成功地进行了一些对异步函数的测试,仅使用一个回调界面作为参数使用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的帮助

相关内容

  • 没有找到相关文章

最新更新