CJR
CJR

Reputation: 3572

RxJava Conditionally return Maybe from Single<String> or Maybe.empty()

I want to have either a Single as return type, or incase of null, an empty maybe.

First, I call a method to get a boolean value:

Single<Boolean> isRemembered()

Then, if this method returns true, call this method:

Single<String> getRemembered()

If, isRemembered() returns true, getRemembered() is never null value.

Here is my attempt at the stream:

public Maybe<String> getRememberIfExists(){
        return sharedPreferencesRepositoryType.isRemembered()
                .flatMapMaybe(aBoolean -> {
                    if(aBoolean){
                        return sharedPreferencesRepositoryType.getRemembered()
                                .flatMapMaybe(Maybe::just);
                    }else{
                        return Maybe.empty();
                    }
                });
    }

I wrote a test for both when isRemembered() returns true and false:

@Test
public void getRememberIfExists() {
    when(repository.getRemembered()).thenReturn(Single.just(REMEMBERED));
    when(repository.isRemembered()).thenReturn(Single.just(true));

    TestObserver<String> observer = interactor.getRememberIfExists()
            .test();

    verify(repository).isRemembered();
    verify(repository).getRemembered();

    observer.assertNoErrors()
            .assertComplete()
            .assertValueCount(1);

    assertEquals(REMEMBERED, observer.values().get(0));


}

@Test
public void getRememberIfExistsError(){
    when(repository.isRemembered()).thenReturn(Single.just(false));

    TestObserver<String> testObserver = interactor.getRememberIfExists()
            .test();

    verify(repository).isRemembered();

    testObserver.assertComplete();
    testObserver.assertEmpty();

}

The first test is successful. The second fails:

java.lang.AssertionError: Completed! (latch = 0, values = 0, errors = 0, completions = 1)

at:

testObserver.assertEmpty()

Any suggestions on how to correctly write my getRememberIfExists() method above?

Upvotes: 1

Views: 2377

Answers (1)

dev.farmer
dev.farmer

Reputation: 2779

According to the reference doc, assertEmpty

Returns a (singleton) Maybe instance that calls onComplete immediately.

So use "assertNoValues" instead of "assertEmpty":

@Test
public void getRememberIfExistsError(){
    when(repository.isRemembered()).thenReturn(Single.just(false));

    TestObserver<String> testObserver = interactor.getRememberIfExists()
            .test();

    verify(repository).isRemembered();

    testObserver.assertComplete();
    testObserver.assertNoValues()

}

Upvotes: 4

Related Questions