【问题标题】:MockitoJUnit tests running in Android Studio but failed when running on the command lineMockitoJUnit 测试在 Android Studio 中运行但在命令行上运行时失败
【发布时间】:2019-01-16 23:51:23
【问题描述】:

我正在尝试使用 MockitoJUnitRunner 运行单元测试;它们在 Android Studio 下运行良好,但在命令行中运行时,一些(不是全部)测试会失败——这很重要,我需要能够从我的持续集成平台运行它们,而不仅仅是从 IDE。这是正在测试的实际方法之一:

internal fun requestSecurityQuestion() {
    if (isViewAttached) mvpView.showLoadingDialog()

    api.getSecurityQuestionToday(mDataManager.token,
            ACTION_ASK_SECURITY_QUESTION_ON_LOGIN, 0)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeWith(object : CallbackWrapper<SettingsResponse>(mDataManager) {
                override fun onSuccess(response: SettingsResponse) {
                    mDataManager.securityQuestion = response.question
                    mDataManager.processId = response.processId

                    if (isViewAttached) {
                        mvpView.dismissLoadingDialog()
                        mvpView.showVsecVerificationDialog(0, response.question!!)
                    }
                }

                override fun onFailed(errorId: Int, jsonResponse: String?) {
                    if (isViewAttached) mvpView.dismissLoadingDialog()
                }
            })
}

这是失败的测试之一:

@RunWith(MockitoJUnitRunner::class)
class HomePresenterTest {

@Mock
private var mView: HomeView? = null
@Mock
private var mDataManager: DataManager? = null
@Mock
private var mApi: Api? = null

lateinit var mPresenter: HomePresenter

@Before
fun setUp() {
    mPresenter = spy(HomePresenter(mDataManager!!))
    mPresenter.attachView(mView!!)
}

@Test
fun requestSecurityQuestion_onSuccess() {
    val response = SettingsResponse()
    response.question = TestData.secretQuestion
    response.processId = TestData.processId

    `when`(mPresenter.api).thenReturn(mApi)
    `when`(mDataManager!!.token).thenReturn(TestData.userToken)
    `when`<Observable<SettingsResponse>>(mApi!!.getSecurityQuestionToday(
            TestData.userToken, ACTION_ASK_SECURITY_QUESTION_ON_LOGIN, 0))
            .thenReturn(Observable.just(response))

    mPresenter.requestSecurityQuestion()

    verify<HomeView>(mView).dismissLoadingDialog()
    verify<HomeView>(mView).showVsecVerificationDialog(0, TestData.secretQuestion)
}
}

这是我使用 ./gradlew testDebugUnitTest

在命令行上运行测试时得到的结果
> Task :app:testDebugUnitTest 

com.domain.app.screens.main.home.HomePresenterTest > requestSecurityQuestion_onSuccess FAILED
org.mockito.exceptions.verification.WantedButNotInvoked at HomePresenterTest.kt:306

另外:我使用的是 Android Studio 3.1.4,Gradle 版本是 3.1.2,Mockito 的版本是 2.8.9

【问题讨论】:

  • 你找到答案了吗?
  • 你找到答案了吗?

标签: android kotlin mockito android-junit


【解决方案1】:

我遇到了同样的问题,但使用的是 Java。

我的原因是,我试图返回一个在静态上下文中调用的方法的模拟,因此我的Mockito.when() 调用没有打扰。尽管这样做是不好的做法,但我还是将方法调用移出了静态上下文,因为它不需要是静态的,而且它可以工作。

也许有帮助。

【讨论】:

    猜你喜欢
    • 2015-05-20
    • 1970-01-01
    • 2019-06-25
    • 1970-01-01
    • 1970-01-01
    • 2016-03-22
    • 2017-10-27
    • 2021-08-08
    • 1970-01-01
    相关资源
    最近更新 更多