当前位置: 首页 > 知识库问答 >
问题:

用RxJava和Mockito创建android单元测试行不通

戈安翔
2023-03-14
class LoginActivityPresenter(private var authUseCase: AuthStructure, private var view: LoginActivityView, private var database: SupervisorDatabaseInterface) {

        fun tryLogin(identifier: String, password: String) {
            val disposable = database.getQrCode() //this retuns Single<QRCode>
                    .doOnSubscribe { view.showProgressDialog() }
                    .doAfterTerminate { view.hideProgressDialog() }
                    .flatMap { it -> authUseCase.authenticate(identifier, password, it.qrcode) }//this retuns Single<UserToken>
                    .subscribe(
                            {
                                database.insertUserToken(it)
                                view.loginSucess()
                            },
                            {
                                when (it) {
                                    is EmptyResultSetException -> {
                                        view.loginErrorNoQrCode()
                                    }
                                    else -> {
                                        view.loginError()
                                        it.printStackTrace()
                                    }
                                }
                            }
                    )
        }
    }
class LoginActivityPresenterTest {
    private val immediateScheduler = object : Scheduler() {
        override fun createWorker(): Worker {
            return ExecutorScheduler.ExecutorWorker(Executor { it.run() })
        }
    }

    private fun <T> any(): T {
        Mockito.any<T>()
        return uninitialized()
    }

    private fun <T> uninitialized(): T = null as T

    @Mock
    private lateinit var mLoginActivityView: LoginActivityView

    @Mock
    private lateinit var mAuthStructure: AuthStructure

    @Mock
    private lateinit var mSupervisorDatabaseInterface: SupervisorDatabaseInterface

    @InjectMocks
    private lateinit var mLoginActivityPresenter: LoginActivityPresenter

    @Before
    fun setup() {
        MockitoAnnotations.initMocks(this)

        RxJavaPlugins.setInitIoSchedulerHandler { immediateScheduler }
        RxAndroidPlugins.setInitMainThreadSchedulerHandler { immediateScheduler }
    }

    @After
    fun tearDown() {
        RxJavaPlugins.reset()
        RxAndroidPlugins.reset()
    }

    @Test
    fun `should happen when you successfully log in`() {
        val userToken = UserToken()
        val qrCode = QRCode("qr")
        val identifier = "test"
        val password = "password"

`when`(mSupervisorDatabaseInterface.getQrCode()).thenReturn(Single.just(qrCode))

        mLoginActivityPresenter.tryLogin(identifier, password)

        verify(mLoginActivityView, times(1)).showProgressDialog()

        verify(mLoginActivityView, times(1)).hideProgressDialog()

        verify(mLoginActivityView, times(1)).loginSucess()

        verify(mLoginActivityView, never()).loginError()
    }
}

MLoginActivityView.LoginError();->在id.teste.supervisor.presenters.login.loginActivityPresenter$tryLogin$Disposable$5.accept(loginActivitypresenter.kt:25)

MLoginActivityView.HideProgressDialog();->在id.teste.supervisor.presenters.login.loginActivityPresenter$tryLogin$Disposable$2.run(loginActivitypresenter.kt:12)

需要但未调用:MLoginActivityView.LoginSucess();->在id.teste.supervisor.presenters.login.loginactivitypresentertest.成功登录时应发生(loginactivitypresentertest.kt:78)

但是,与此模拟的交互正好有3个:mLoginActivityView.ShowProgressDialog();->在id.teste.supervisor.presenters.login.loginActivityPresenter$tryLogin$Disposable$1.accept(loginActivitypresenter.kt:11)

MLoginActivityView.LoginError();->在id.teste.supervisor.presenters.login.loginActivityPresenter$tryLogin$Disposable$5.accept(loginActivitypresenter.kt:25)

MLoginActivityView.HideProgressDialog();->在id.teste.supervisor.presenters.login.loginActivityPresenter$tryLogin$Disposable$2.run(loginActivitypresenter.kt:12)

共有1个答案

狄兴业
2023-03-14
`when`(mAunthStructure.authenticate(any(), any(), any())).thenReturn(
    Single.just(
        UserToken() 
)
 类似资料:
  • 问题内容: 有人可以帮我这个忙。我正在使用Jersey休息测试框架版本2.21(在Grizzly容器上)编写Rest资源的单元测试。 当我调试测试类时,看到myManager的模拟对象。但是,当调试进入“ MyResouce类”时,myManager对象将变为null并得到NullPointer异常。 尝试过其他人提供的解决方案,但是没有运气。请有人帮我。我将近三天就遇到这个问题。:( 我的资源类

  • 为了让单元测试跑一个批处理的任务,这个框架必须加载这个任务的ApplicationContext,两个注解的触发方式: @RunWith(SpringJUnit4ClassRunner.class):表明这个类需要使用Spring的测试工具 @ContextConfiguration(locations = {…}):表明哪些xml文件包含ApplicationContext @RunWith

  • 问题内容: 我正在使用RestTemplate 方法将正文发布到端点。我需要使用Mockito为我的代码编写测试用例的帮助。返回类型为void,但是可以将其更改为,或者需要进行测试。我已经提到了许多其他文档,但是它们非常笼统,我尝试使用它们,但是由于and和return类型是不同的,所以大多数对我来说都不起作用。。任何建议表示赞赏。谢谢 这是我的Java课 问题答案: 您正在测试MyClass类中

  • 我在java中使用mockito编写单元测试。 这就是我要测试的声明。 电影是电影名称的集合,是识别电影的关键。 我嘲笑了守望者班 Mockito.when(watcher.watch(Matchers.any(Set.class))) “thenReturn”中包括什么??

  • 我有DaoImpl类: 我的测试是: 测试是成功的,但是当我运行具有覆盖率的junit测试时,它显示方法没有被覆盖,因此我的整体单元测试行覆盖率低于要求。我们能涵盖那部分吗?如果是,我们怎么做?谢了。