1. 概述

在这个简短教程中,我们将比较两种创建RxJava单例对象的流行方法,并使用TestSubscriber进行测试。首先,我们将探讨Single.just()工厂方法,并使用它立即创建一个对象实例。接下来,我们将学习Single.fromCallable(),了解如何利用它提升性能。

2. Single.just()

Single.just()是创建Observable实例的直接方式。它接受一个对象作为参数,将其封装在RxJava的Single中:

Single<String> employee = Single.just("John Doe");

然而,大多数情况下,我们会通过某种方式获取或计算数据。为了演示,假设我们在EmployeeRepository类中获取员工的名字。在测试时,我们将使用Mokito来检查与该仓库的交互,并使用TestSubscriber测试生成的Observable发布的值:

@Test
void givenASubscriber_whenUsingJust_thenReturnTheCorrectValue() {
    TestSubscriber<String> testSubscriber = new TestSubscriber<>();
    Mockito.when(repository.findById(123L)).thenReturn("John Doe");

    Single<String> employee = Single.just(repository.findById(123L));
    employee.subscribe(testSubscriber);

    testSubscriber.assertValue("John Doe");
    testSubscriber.assertCompleted();
}

正如预期的那样,testSubscriber发布的数据与仓库返回的相同。另一方面,即使没有订阅者,数据仍然会被获取。让我们使用Mokito验证与EmployeeRepository的交互次数:

@Test
void givenNoSubscriber_whenUsingJust_thenDataIsFetched() {
    Mockito.when(repository.findById(123L)).thenReturn("John Doe");

    Single<String> employee = Single.just(repository.findById(123L));

    Mockito.verify(repository, times(1)).findById(123L);
}

3. Single.fromCallable()

作为替代方案,我们可以使用Single.fromCallable()。在这种情况下,我们需要提供Callable接口的实现或lambda表达式。换句话说,我们可以传递一个函数来获取数据,这个函数只有在有人订阅时才会被调用。因此,如果没有订阅者,将不会与仓库进行交互

@Test
void givenNoSubscriber_whenUsingFromCallable_thenNoDataIsFetched() {
    Single<String> employee = Single.fromCallable(() -> repository.findById(123L));

    Mockito.verify(repository, never()).findById(123L);
}

但一旦有人订阅employee,数据就会被获取并发布。让我们添加另一个测试,检查结果的Single对象是否发布正确的值:

@Test
void givenASubscriber_whenUsingFromCallable_thenReturnCorrectValue() {
    TestSubscriber<String> testSubscriber = new TestSubscriber<>();
    Mockito.when(repository.findById(123L)).thenReturn("John Doe");

    Single<String> employee = Single.fromCallable(() -> repository.findById(123L));
    employee.subscribe(testSubscriber);

    Mockito.verify(repository, times(1)).findById(123L);
    testSubscriber.assertCompleted();
    testSubscriber.assertValue("John Doe");
}

4. 总结

在这篇文章中,我们比较了Singlejust()fromCallable()工厂方法。我们了解到,如果我们想在获取数据时利用懒加载特性,应该选择fromCallable()选项。

项目的所有完整源代码,包括这里使用的所有示例代码,可以在GitHub上找到。