我有編寫Single
運算符的測試的麻煩。出於某種原因,Subscriber
在創建後被標記爲unsubscribed
。RxJava TestSubscriber/TestSingleSubscriber
代碼片段:
public abstract class OneShotUseCase<T> {
@NonNull
private CompositeSubscription subscription = new CompositeSubscription();
public void cancel() {
subscription.clear();
}
public void execute(@NonNull SingleSubscriber<T> subscriber) {
subscription.add(
build().subscribe(subscriber)
);
}
@NonNull
protected abstract Single<T> build();
}
測試爲:
@RunWith(JUnit4.class)
public class OneShotUseCaseTest {
private OneShotUseCase<String> sut;
@Before
public void setUp() {
sut = new TestUseCase();
}
@Test
public void shouldBuildUseCase() {
final TestSingleSubscriber<String> stringTestSingleSubscriber = new TestSingleSubscriber<>();
sut.execute(stringTestSingleSubscriber);
stringTestSingleSubscriber.assertValue("Test value");
}
@Test
public void shouldCancelUseCase() {
final TestSingleSubscriber<String> stringTestSingleSubscriber = new TestSingleSubscriber<>();
sut.execute(stringTestSingleSubscriber);
sut.cancel();
stringTestSingleSubscriber.assertUnsubscribed();
}
private static class TestUseCase extends OneShotUseCase<String> {
@NonNull
@Override
protected Single<String> build() {
return Single.just("Test value");
}
}
}
由於TestSingleSubscriber
我使用下面的代碼:https://github.com/ReactiveX/RxJava/pull/3834
在行stringTestSingleSubscriber.assertUnsubscribed();
我我的測試失敗試圖挖掘一點點,但之前我沒有發現任何問題。
對我的理解RxJava Single有什麼不對嗎?
值得一提的是,與Observable<T>
代替Single
非常相似的代碼在測試中完美工作。
我希望在這裏找到一些想法如何使它工作。
這可能是幫助需要注意的文件,它說 '''一單將只調用這些方法之一,並且將只調用一次。在調用任一方法後,Single將終止,並且對它的訂閱結束 ''' 因此,實際上,'Single'發出它的值,並立即終止您的訂閱。 –
好點,但我猜即使'assertUnsubscribed'不應該失敗,對吧? – jakubbialkowski
運行測試時,'shouldBuildUsecase'會運行併成功通過。在什麼時候'sut'會被終止。嘗試爲每個測試用例創建一個新的'sut',看看它是否適用於您 –