2016-09-15 44 views
0

我试图调试RxJava订阅对象的内部成功回调,并验证使用正确参数调用的那些内部某些方法。我读了一些关于Captors的文章,虽然也许这是要走的路,但无法找到符合我需求的例子。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并在它上面做断言。参考: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

嘿测试私人方法,你可以使用PowerMock,它使用JAVA反射给予访问。但通常不建议测试私有方法。 http://stackoverflow.com/questions/34571/how-to-test-a-class-that-has-private-methods-fields-or-inner-classes –