Nick Cardoso
Nick Cardoso

Reputation: 21733

What is the right way to mock an RxJava Observable

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

Answers (2)

Alex Shutov
Alex Shutov

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

Kevin Robatel
Kevin Robatel

Reputation: 8386

return Observable.just(new MyData());

You can find the documentation here. And for more complicated mock => list of creating operators.

Upvotes: 17

Related Questions