Rx java 如何在RxJava中使用TestScheduler
我应该如何使用RxJava的Rx java 如何在RxJava中使用TestScheduler,rx-java,Rx Java,我应该如何使用RxJava的TestScheduler?我来自.NET背景,但RxJava中的TestScheduler似乎与.NETRx中的测试调度器的工作方式不同 下面是我要测试的示例代码 Observable<Long> tick = Observable.interval(1, TimeUnit.SECONDS); contactsRepository.find(index) .buffer(MAX_CONTACTS_FETCH) .zipWith(tick, new
TestScheduler
?我来自.NET背景,但RxJava中的TestScheduler
似乎与.NETRx中的测试调度器的工作方式不同
下面是我要测试的示例代码
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()
没有运气。我举了一个小例子,说明如何使用
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());
}
你有一些课程:
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()
}
}
此解决方案是对公认答案的改进,因为生产代码的质量、完整性和简单性得到了维护。是的,这很好,但是测试一段“真实的/代码,让我们留下来吧”怎么样?您有一个可观察订阅者的方法,该订阅者执行一些回调onComplete和一些其他回调onError。我已经在
subscribeOn
中注入了测试计划程序,但没有成功。您没有将TestScheduler
传递给可观察的。Interval
。这在.NET中也是一个问题。谢谢!我正在使用throttleFirst
,我的测试失败了,因为它没有像我的测试调度器那样提前时间。
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);
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()
}
}
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);
}