我应该如何使用RxJava的TestScheduler?我来自.NET背景,但RxJava中的TestScheduler似乎与.NET rx中的测试调度程序的工作方式不同。
下面是我想要测试的示例代码
Observable<Long> tick = Observable.interval(1, TimeUnit.SECONDS);
contactsRepository.find(index)
.buffer(MAX_CONTACTS_FETCH)
.zipWith(tick, new Func2<List<ContactDto>, Long, List<ContactDto>>() {
@Override
public List<ContactDto> call(List<ContactDto> contactList, Long aLong) {
return contactList;
}
}).subscribe()我试过了:
subscribeOn(testScheduler)
testScheduler.advanceTimeBy(2, TimeUnit.SECONDS);
testScheduler.triggerActions();不走运。
发布于 2014-11-02 21:42:29
我做了一个如何使用TestScheduler的小例子。我认为它非常类似于.NET实现
@Test
public void should_test_the_test_schedulers() {
TestScheduler scheduler = new TestScheduler();
final List<Long> result = new ArrayList<>();
Observable.interval(1, TimeUnit.SECONDS, scheduler)
.take(5)
.subscribe(result::add);
assertTrue(result.isEmpty());
scheduler.advanceTimeBy(2, TimeUnit.SECONDS);
assertEquals(2, result.size());
scheduler.advanceTimeBy(10, TimeUnit.SECONDS);
assertEquals(5, result.size());
}根据您的代码编辑:您应该将调度程序传递给Observable.interval操作,因为这是您想要控制的内容:
TestScheduler scheduler = new TestScheduler();
Observable<Long> tick = Observable.interval(1, TimeUnit.SECONDS, scheduler);
Subscription toBeTested = Observable.from(Arrays.asList(1, 2, 3, 4, 5))
.buffer(3)
.zipWith(tick, (i, t) -> i)
.subscribe(System.out::println);
scheduler.advanceTimeBy(2, TimeUnit.SECONDS);发布于 2017-04-07 10:19:48
你有一些类:
public class SomeClass {
public void someMethod() {
Observable<Long> tick = Observable.interval(1, TimeUnit.SECONDS);
contactsRepository.find(index)
.buffer(MAX_CONTACTS_FETCH)
.zipWith(tick, new Func2<List<ContactDto>, Long, List<ContactDto>>() {
@Override
public List<ContactDto> call(List<ContactDto> contactList, Long aLong) {
return contactList;
}
}).subscribe()
}
}在文档中查找[Observable.interval][1],您将看到它在计算调度器上运行,所以让我们在我们的测试中覆盖它。
public class SomeClassTest {
private TestScheduler testScheduler;
@Before
public void before() {
testScheduler = new TestScheduler();
// set calls to Schedulers.computation() to use our test scheduler
RxJavaPlugins.setComputationSchedulerHandler(ignore -> testScheduler);
}
@After
public void after() {
// reset it
RxJavaPlugins.setComputationSchedulerHandler(null);
}
@Test
public void test() {
SomeClass someInstance = new SomeClass();
someInstance.someMethod();
// advance time manually
testScheduler.advanceBy(1, TimeUnit.SECONDS);
}这个解决方案是对公认答案的改进,因为产品代码的质量、完整性和简单性都得到了维护。
https://stackoverflow.com/questions/26699147
复制相似问题