2016-07-11 28 views
1

我有編寫Single運算符的測試的麻煩。出於某種原因,Subscriber在創建後被標記爲unsubscribedRxJava 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非常相似的代碼在測試中完美工作。

我希望在這裏找到一些想法如何使它工作。

+1

這可能是幫助需要注意的文件,它說 '''一單將只調用這些方法之一,並且將只調用一次。在調用任一方法後,Single將終止,並且對它的訂閱結束 ''' 因此,實際上,'Single'發出它的值,並立即終止您的訂閱。 –

+0

好點,但我猜即使'assertUnsubscribed'不應該失敗,對吧? – jakubbialkowski

+0

運行測試時,'shouldBuildUsecase'會運行併成功通過。在什麼時候'sut'會被終止。嘗試爲每個測試用例創建一個新的'sut',看看它是否適用於您 –

回答

1

感謝偉大RxJava社區,我可以張貼工作的解決方案:

public void execute(@NonNull SingleSubscriber<T> subscriber) { 
     build().subscribe(subscriber); 
     subscription.add(subscriber); 
    } 

問題的關鍵在於實施細節subscribe方法是如何工作的SingleObservable

問題是解決了在Github上,所以我張貼的鏈接: https://github.com/ReactiveX/RxJava/issues/4193