2016-09-15 10 views
0

RxJavaサブスクリプションオブジェクトの内部成功コールバックをデバッグしようとしていて、正しい引数で呼び出された特定のメソッドを確認しようとしています。私はキャプターズについていくつか読んでいますが、それは行く方法ですが、私のニーズに合った例を見つけることができませんでした。Android - RxJavaサブスクリプション内でコールバックをデバッグする方法

私はとのユニットテストだ:MockitoJUnitの

// OrderHistoryPresenterImpl presenter; 
public void loadOrderHistory(final int offset, final int limit) { 
    mCompositeSubscription.add(useCase.getOrderHistory(offset, limit) 
      .doOnError(throwable -> Timber.e(throwable, "Error")) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(new Subscriber<ListOfOrders>() { 
       @Override 
       public void onCompleted() {} 

       @Override 
       public void onError(Throwable e) {} 

       @Override 
       public void onNext(ListOfOrders listOfOrders) { 
        // 
        // I would like to verify the calls in this method 
        // 
        user.setTryoutCountActive(listOfOrders.getActiveTryoutsCount()); 

        getView().addOrdersToView(listOfOrders); 

        mCompositeSubscription.clear(); 
       } 
      }) 
    ); 
} 

そして、ここでは、私はあなたが見ることができるように

@RunWith(MockitoJUnitRunner.class) 
public class OrderHistoryPresenterTest { 
    // Boiler plate Dagger 2 setup + variable declarations 

    private ListOfOrders response; 
    private ListOfOrders spyListOfOrders; 
    private OrderHistoryPresenterImpl presenter; 
    @Mock private OrderHistoryUseCaseImpl useCase; 

    @Before 
    public void setUp() throws FileNotFoundException { 
     // Setup + dagger 2 setup… 

     response = Utils.fromJson(gson, this, "OrderHistory.json", type); 
     spyListOfOrders = spy(response); 

     presenter = new OrderHistoryPresenterImpl(app, useCase, user); 

     when(useCase.getOrderHistory(MOCK_USER_ACCESS_TOKEN)).thenReturn(Observable.just(spyListOfOrders)); 
    } 

    @After 
    public void tearDown() {…} 

    @Test 
    public void shouldGetOrderAndCall_addOrdersToView_OnActivity() { 
     presenter.loadOrderHistory(MOCK_OFFSET, MOCK_LIMIT); 

     // works… 
     verify(useCase, times(1)).getOrderHistory(MOCK_USER_ACCESS_TOKEN); 

     // This fails because it gets called right away because it's async - what to do? 
     verify(view, times(1)).addOrdersToView(spyListOfOrders); 
    } 
} 

でそれをテストしようとしているテストです私は内部のSubscriber<ListOfOrders>コールバックメソッドをテストする方法を知らない。どんな助けでも大歓迎です!

+0

"Observable"が動作しているかどうかをテストしたい場合は、TestSubscriberを使用し、その上にアサーションを行うことができます。 Ref:http://reactivex.io/RxJava/javadoc/rx/observers/TestSubscriber.html。しかし、あなたがonNextのようなSubscriberメソッドをテストしたいならば、あなたのテストでこれをモックできるように、あなたの 'loadOrderHistory'(新しいものを作るのではなく)を渡してください。 –

+0

チェックアウト[RxJavaDebug](https://github.com/ReactiveX/RxJavaDebug)。それは助けるかもしれません。 –

答えて

0

は、あなたがこのようなあなたの方法を書き換える場合、

// OrderHistoryPresenterImpl presenter; 
public void loadOrderHistory(final int offset, final int limit) { 
    mCompositeSubscription.add(useCase.getOrderHistory(offset, limit) 
     .doOnError(throwable -> Timber.e(throwable, "Error")) 
     .observeOn(AndroidSchedulers.mainThread()) 
     .subscribe(new Subscriber<ListOfOrders>() { 
      @Override 
      public void onCompleted() {} 

      @Override 
      public void onError(Throwable e) {} 

      @Override 
      public void onNext(ListOfOrders listOfOrders) { 
       load(listOfOrders) 
      } 
     }) 
    ); 
} 

void loadOrders(ListOfOrders list) { 
    // I would like to verify the calls in this method 
    user.setTryoutCountActive(listOfOrders.getActiveTryoutsCount()); 

    getView().addOrdersToView(listOfOrders); 

    mCompositeSubscription.clear(); 
} 

今すぐ別途loadOrdersメソッドをテストしましょう。それが気にするのは、処理する注文のリストを取得することだけです。どこからでも来ることができます(観察できるだけでなく)。

このメソッドを今すぐテストすることができます。

Observableをテストする場合は、TestSubscriberを使用して、実際にObservableから注文のリストを取得しているかどうかを確認してください。 Ref:https://reactivex.io/RxJava/javadoc/rx/observers/TestSubscriber.html

+0

ここで問題となるのは、loadOrdersをテストできる唯一の方法は、このようなメソッドをプライベートに保つことを望んでいても公開することです。テストファイルを別々にパッケージ化したまま、クリーンな作業を行うことができますか? – Maruf

+0

プライベートメソッドをテストするために、JAVA Reflectionを使用するPowerMockを使用してアクセスできます。しかし、一般的にプライベートメソッドをテストすることはお勧めしません。 http://stackoverflow.com/questions/34571/how-to-test-a-class-that-has-private-methods-fields-or-inner-classes –

関連する問題