译者注:关注InfoQ资讯的读者可能已经留意到,我们前面给出了一篇很好的RxJava文章“测试RxJava”。本文是上一篇文章的修订,用相同的例子循序渐进地介绍了如何测试RxJava2。译者将两篇文章中的不同之处用粗体标识出来,并使用添加注释的形式说明示例代码中的差异之处,以供读过前篇的读者快速浏览本文。\
\\关键要点:
\
- RxJava含有内建的、测试友好的解决方案。 \
- 使用TestSubscriber去验证Observable。 \
- 使用TestScheduler可实现对时间的严格控制。 \
- Awaitility库提供了对测试环境进一步的控制。
本文是“测试RxJava”一文的修订,根据RxJava2规范做了全面更新。\
你已经阅读过RxJava的相关内容,也已经在互联网上体验过像“RxJava实例解析”中的那些示例,现在打算在自己的代码中探索一下响应式编程了。但是,现在却一直困扰着如何测试那些可能会在代码库中发现的新功能呢?\
使用响应式编程,就必须转变对给定问题的推理方式,因为我们要聚焦于作为事件流的流动数据,而非个别数据项。事件通常是被不同的线程所产生和消费,因此在编写测试时必须要对并发问题有着清晰的认识。幸运的是,RxJava提供了测试Observable和Subscription的内建支持,并且是直接构建于RxJava的核心依赖中。\
第一步
\让我们回顾一下在“RxJava by Example”一文中所给出的那个词汇的例子,看一下如何对该例子作测试。让我们从基础测试工具的设置开始。在我们的测试架构中,使用了JUnit作为测试工具。
import io.reactivex.Observable;\import io.reactivex.observers.TestObserver;\import io.reactivex.plugins.RxJavaPlugins;\import io.reactivex.schedulers.Schedulers;\//RxJava2中,包名由rx.xxx改为io.reactivex.xxx。\import org.junit.Test;\import java.util.*;\import static java.util.concurrent.TimeUnit.SECONDS;\import static org.awaitility.Awaitility.await;\import static org.junit.Assert.assertThat;\import static org.hamcrest.Matchers.*;\\\public class RxJavaTest {\ private static final List\u0026lt;String\u0026gt; WORDS = Arrays.asList(\ \"the\