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. 总结
在这篇文章中,我们比较了Single
的just()
和fromCallable()
工厂方法。我们了解到,如果我们想在获取数据时利用懒加载特性,应该选择fromCallable()
选项。
项目的所有完整源代码,包括这里使用的所有示例代码,可以在GitHub上找到。