Search code examples
unit-testingjunitmockitorx-javapowermockito

RxJava Mockito when - Returning a Resolved Observable


I am testing a method which calls a helper library method that returns an Observable<Void> and upon completion it runs it's logic in a flatMap and calls an API end point which returns an Observable<SomeObject>.

The problem I'm having is that in my test is never getting to the flatMap.

@Mock private RequestHelperSourceImpl requestHelper;
@Mock private OrdersRepositoryImpl repository;

// setup & teardown code…

@Test
public void shouldSingleOrder() {
    SingleOrder singleOrder = mock(SingleOrder.class);
    TestSubscriber<SingleOrder> testSubscriber = new TestSubscriber<>();

    when(requestHelper.doJwtRequest(anyString())).thenReturn(Observable.just(null));
    when(repository.getOrder(anyLong(), anyString(), anyString(), anyInt())).thenReturn(Observable.just(singleOrder));

    // The method I'm testing
    spySubject.getOrder(anyInt(), anyString());

    testSubscriber.assertValue(singleOrder);
}

Here is the code for the method I'm testing

@Override
public Observable<SingleOrder> getOrder(long orderId, String jwtToken) {
    return requestHelper.doJwtRequest(jwtToken)
            .flatMap(Void -> {
                ////////<------ It never gets here
                return repository.getOrder(
                        orderId,
                        requestHelper.getAccessToken(),
                        jwtToken,
                        jtApp.isTryoutInt()
                ).compose(JTRxUtils.applySchedulers());
            });
}

And here's the signature for doJwtRequest

Observable<Void> doJwtRequest(String jwt);

Here's the error I get when running the test:

java.lang.AssertionError: Number of items does not match. Provided: 1  Actual: 0.
Provided values: [singleOrder]
Actual values: []
 (0 completions)

Solution

  • You need to at least subscribe to the TestSubscriber:

    spySubject
    .getOrder(anyInt(), anyString())
    .subscribe(testSubscriber);
    

    If your code is asynchronous (because you have a scheduler switch), convert to a blocking Observable first.