扣丁书屋

RxJava Observables单元测试

RxJava Observables单元测试

RxJava是一个非常棒的类库,但是它不容易上手,在这里,我们列出了不同的方法来对Observables进行单元测试。

ribot时,我们几个月前开始使用RxJava,而现在它已经成为我们开发的安卓应用的核心架构元素。使用RxJava有很多益处,但是学习(使用)的过程是曲折的,很多时候,我们发现我们试图让自己的头脑中环绕着那些解释操作过程如何工作的“美丽”蓝图。

改变我们架构的第一步就是改变那些定义在数据层的方法,让他们返回Observables。下一个问题是:我们如何对此进行单元测试?

丑陋的方式

我们头脑中首先想到的是以同样的方式简单地描述我们的外部测试结果,然后将结果保存在一个全局变量,可以在以后进行断言。例如,假设我们有一个方法在一个database helper类中,负责加载用户对象。

public Observable<User> loadUser() {
    ...
}

然后,针对这个方法的测试就会如同下面这样:

    User mUser;
    @Test
    public void shouldLoadUser() throw Exception {
    databaseHelper.loadUser()
        .subscribe(new Action1<User>() {
            @Override
            public void call(User user) {
                mUser = user;
            }
         });
    assertNotNull(mUser);
    }

默认情况下,这段代码将会执行,因为Observable会在同一个线程上执行。 因此,在结果设置为全局变量后断言会一直执行。

更好的方式

我们很快意识到先前的解决方式是不完美的。尽管先前的方法能够工作,(但是)它需要大量的模版代码。所以,我们决定创建一个类,该类提供一个名称为subscribeAssertingThat()的静态方法。这个类允许我们subscribe 一个observable,保存测试结果并且以一种清晰的方式执行一些断言。例如:

    @Test
    public void shouldLoadTwoUsers() throw Exception {
     subscribeAssertingThat(databaseHelper.loadUser())
       .completesSuccessfully()
       .hasSize(2)
       .emits(user1, user2)
    }

通过100行左右的代码,我们称为RxAssertions的这个类使我们的测试可读性和可写性更好。你可以在这里找到RxAssertions类的代码。

标准方式

后来,我们发现RxJava 提供了一个称为TestSubscriber的subscriber专用类型。

TestSubscriber由各种各样的Subscriber(组成),你可以用于单元测试,执行断言,检查接收到的事件,或封装mocked类型的Subscriber。

与第二个解决方案类似,测试subscriber允许你通过结果执行断言。例如:

    @Test
    public void shouldLoadTwoUsers() throw Exception {
        TestSubscriber<User> testSubscriber = new TestSubscriber<>();
        databaseHelper.loadUser().subscribe(testSubscriber);
        testSubscriber.assertNoErrors();
        testSubscriber.assertReceivedOnNext(Arrays.asList(user1, user2))
    }

我们还没有频繁的使用TestSubscriber,但你可以看到上面的代码是相当优雅和可读。除了不同的断言,通过 Observable调用getOnNextEvents()方法,它也允许你恢复整个发现的问题列表。

当使用TestSubscriber时,你会发现链接的断言是不可能的,因为断言方法不返回TestSubscriber。这个能力将是一个很好的改善(方向)。

总结

TestSusbcriber可能是目前最好的选择,因为它是RxJava codebase的一部分,它会不断的改进以及将新功能合并。能够了解别的开发者如何进行Observables的单元测试时很棒的。除了那些我在这里提到的其他方法,你还有什么方法(用于测试)?

当钢铁侠反应更灵敏-RxJava

发布于:2年以前  |  1761次阅读  |  详细内容 »

用RxJava替代EventBus

发布于:2年以前  |  2567次阅读  |  详细内容 »

RxJava Observables单元测试

发布于:2年以前  |  1719次阅读  |  详细内容 »

RxJava中repeatWhen 和 retryWhen 操作符的解释

发布于:2年以前  |  3320次阅读  |  详细内容 »

NotRxJava懒人专用指南

发布于:2年以前  |  1601次阅读  |  详细内容 »

使用RxJava从多个数据源中加载数据

发布于:2年以前  |  2079次阅读  |  详细内容 »

在Android开发中使用RxJava

发布于:2年以前  |  1617次阅读  |  详细内容 »

如何理解RxJava中的Subjects(第一部分)

发布于:2年以前  |  1650次阅读  |  详细内容 »

结合RxJava更简单地使用SQLite

发布于:2年以前  |  1666次阅读  |  详细内容 »

使用RxJava缓存Rest请求

发布于:2年以前  |  1537次阅读  |  详细内容 »

Android中调试RxJava

发布于:2年以前  |  1394次阅读  |  详细内容 »

使用RxJava.Observable取代AsyncTask和AsyncTaskLoader

发布于:2年以前  |  2071次阅读  |  详细内容 »

使用RxJava 2.0

发布于:2年以前  |  1653次阅读  |  详细内容 »

使用RxJava缓存Rest请求

原文链接 : Subscribe It While It&#039;s Hot: Cached Rest Requests With RxJava 免责声明: 在这篇文章中,我尝试去用正确的方法来解决一个常见的问题。我仍然正在整理我脑袋...

发布于:3年以前  |  2646次阅读  |  详细内容 »

在Android开发中使用RxJava

ReactiveX是专注于异步工作的API,它将异步事件的处理与观察者模式、迭代器模式及函数式编程相结合了起来。实时地处理返回数据是在工程中经常出现的情景,所以使用高效、可...

发布于:3年以前  |  2358次阅读  |  详细内容 »

Android中调试RxJava

原文链接 : Debugging RxJava on Android 调试是查找和分析bug的过程或者预防软件的正确操作出现问题Wikipedia。 当前调试不是一件容易的事情,我们在处理Android的异步操...

发布于:3年以前  |  2338次阅读  |  详细内容 »

所属标签

最多阅读

简化Android的UI开发 2年以前  |  515032次阅读
Android 深色模式适配原理分析 1年以前  |  26281次阅读
Android 样式系统 | 主题背景覆盖 1年以前  |  7862次阅读
Android Studio 生成so文件 及调用 1年以前  |  5419次阅读
30分钟搭建一个android的私有Maven仓库 3年以前  |  4672次阅读
Android设计与开发工作流 2年以前  |  4336次阅读
Google Enjarify:可代替dex2jar的dex反编译 3年以前  |  4315次阅读
Android多渠道打包工具:apptools 3年以前  |  3969次阅读
移动端常见崩溃指标 1年以前  |  3859次阅读
Google Java编程风格规范(中文版) 3年以前  |  3852次阅读
Android-模块化-面向接口编程 1年以前  |  3770次阅读
Android UI基本技术点 3年以前  |  3739次阅读
Android内存异常机制(用户空间)_NE 1年以前  |  3719次阅读
Android死锁初探 1年以前  |  3668次阅读

手机扫码阅读