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

单元测试RxJava上完成,上下一步和上错误

万俟均
2023-03-14

我无法找到在android中对RxJava的onComplete、onNext和onError案例进行单元测试的方法

TestSubcriber似乎解决了这个问题,但是作为RXJava的新手,我仍然不知道如何做到这一点。

MyApi.method()
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(object : Observer<SettleCodeResponse> {
        override fun onCompleted() {
        }

        override fun onError(e: Throwable) {
            view.hideProgress()
            Logger.logError(TAG, e.message)
        }

        override fun onNext(response: SettleCodeResponse) {
            view.hideProgress()
            process(response)
        }
    })

共有2个答案

佴英奕
2023-03-14

首先,您需要模拟myApi实例并定义myApi.method()的响应。

您可以使用TestObserver根据响应断言接收链的不同场景。

@Test
fun test() {
    //mock the response of the method
    when(myApi.method()).thenReturn(Observable.just(someSettleCodeResponse())

    //create a test observer and subscribe
    val observable: Observable<SettleCodeResponse> = myApi.method()
    val observer: TestObserver<SettleCodeResponse> = TestObserver()
    observable.subscribe(observer)

    //test the observer behaviour
    observer.assertComplete()
            .assertNoErrors()
            .assertValue(someSettleCodeResponse())
}

您还可以测试整个流程,并查看是否调用了view方法。为此,您需要模拟您的myApi以及视图。假设代码是演示者或视图模型中方法的一部分。

@Test
fun anotherTest() {
    //mock the response of the method
    when(myApi.method()).thenReturn(Observable.just(someSettleCodeResponse())

    //call the method you want to test
    presenter.method()

    //test that the view mock methods are called
    verify(view).hideProgress()
}

井学
2023-03-14

我不确定是否要模拟静态类,但您可以尝试这种方法吗。

首先,你必须嘲笑MyApi。

在任何课堂上

class Foo(private val view: SomeView, private val myApi: MyApi) {
    fun doSomething() {
        myApi.method().subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(object : Observer<SettleCodeResponse> {
                override fun onCompleted() {}

                override fun onError(e: Throwable) {
                    view.hideProgress()
                    Logger.logError(TAG, e.message)
                }

                override fun onNext(response: SettleCodeResponse) {
                    view.hideProgress()
                    process(response)
                }
            })
    }
}

在你的测试中

lateinit var myApi: MyApi
lateinit var view: SomeView
lateinit var foo: Foo

@Before
fun setup() {
    RxAndroidPlugins.setInitMainThreadSchedulerHandler({ Schedulers.trampoline() })
    MockitoAnnotations.initMocks(this)
    myApi = mock(MyApi:class.java)
    view = mock(SomeView::class.java)
    foo = Foo(view, myApi)
}

@Test
fun testOnNext() {
    given(myApi.method()).willReturn(SettleCodeResponse())
    foo.doSomething()
    verify(view).hideProgress()
}

 类似资料:
  • 我正在为cadence活动功能编写一个单元测试,它使用UUID从联系服务中检索联系人。我想知道我应该把什么样的背景加入到节奏活动中。 这是测试功能。 我收到的错误消息:

  • 我是MongoDB的新手,正在建立一个新的应用程序。NETC#MVC项目来尝试一下。 使用当前的MongoDB。nuget的驱动程序2.2.2。 问题:我有一个单元测试成功,但不保存任何数据到MongoDB集合。 但是,如果我将相同的测试放在MVC控制器下,它将保存数据: 我很好奇为什么会这样? 以下是MongoDatabase类:

  • 我正在编写集成测试,我想使用事务范围。我们使用EF和带有上下文的存储库。 编辑在评论中我被要求包括更多的代码,然而,我认为没有必要回答我的问题。

  • 单元测试 单元测试仅依赖于源代码,是测试代码逻辑是否符合预期的最简单方法。 运行所有的单元测试 make test 仅测试指定的package # 单个package make test WHAT=./pkg/api # 多个packages make test WHAT=./pkg/{api,kubelet} 或者,也可以直接用go test go test -v k8s.io/kubernet

  • 有没有一种方法可以让发出数据,并且当它发出数据时(或者当它完成时)以异步方式使用该数据触发? 我的问题与此非常相似,但我试图异步调用Completable。 这是我试图实现的一个微不足道的例子: 我看到订阅映射中的Completable允许我以某种方式完成这项任务,但我不知道如何以正确的方式处理它(因为在活动中不调用此方法)。 非常感谢您的帮助,谢谢!

  • 我正在设置我的第一个Jenkins服务器来构建和测试现有的maven项目,而jenkins无法完成单元测试。 当我从命令行运行“mvn清洁安装”时,所有模块都会构建并通过它们的单元测试。然而,Jenkins只能运行第一组单元测试(通过),然后以某种方式出错。 我用的是詹金斯1.499。 以下是来自顶级pom报告插件的一些相关信息:

  • 消息: 代码: 我尝试的: 我不知道我做错了什么,我尝试了不同的方法,比如: 1. 2. 3. 我做错了什么?

  • 我们有一个spring组件,它将应用程序上下文设置为一个静态字段。然后从应用程序的其他部分访问该静态字段。我知道不应该使用,但有时需要从非spring管理的bean访问spring上下文。例如。字段如下所示: (取自http://www.dcalabrise.com/blog/java/spring-context-static-class/) 问题在于,当在集成测试中使用JUnit(或Spock