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)
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.