Reputation: 21733
I have an API which returns Observable
's to be used with RxJava. For testing I want to avoid network operations so plan to mock the responses. However as all responses must me wrapped with Observable
and the from()
method expects a Future
not a concrete type, my mock class is convoluted with anonymous wrapper classes and I think there must be a better way.
Here is what I have:
public class MockApi implements MyApi {
@Override
public Observable<MyData> getMyData() {
return Observable.from(new Future<MyData>() {
@Override public boolean cancel(boolean mayInterruptIfRunning) { return false; }
@Override public boolean isCancelled() { return false; }
@Override public boolean isDone() { return false; }
@Override
public MyData get(long timeout, TimeUnit unit) throws InterruptedException,
ExecutionException, TimeoutException {
return get();
}
@Override
public MyData get() throws InterruptedException, ExecutionException {
return new MyData();
}
});
}
...
}
Is there a better way?
Upvotes: 8
Views: 9623
Reputation: 3282
You can use Observable.defer(() -> Observable.just(new MyData())
, or use PublishSubject for sending data through it. Notice, you have to use .defer() operator in first case because it will use the same value from first call otherwise
Upvotes: 1
Reputation: 8386
return Observable.just(new MyData());
You can find the documentation here. And for more complicated mock => list of creating operators.
Upvotes: 17