Правильный макет и тестирование класса интерактора в Android - PullRequest
0 голосов
/ 01 мая 2019

У меня небольшая проблема с настройкой правильных модульных тестов для моих интерактивных классов в моем приложении для Android. В этих классах у меня есть «бизнес-логика» моего приложения.

Вот один из таких классов:

public class ChangeUserPasswordInteractor {

    private final FirebaseAuthRepositoryType firebaseAuthRepositoryType;

    public ChangeUserPasswordInteractor(FirebaseAuthRepositoryType firebaseAuthRepositoryType) {
        this.firebaseAuthRepositoryType = firebaseAuthRepositoryType;
    }

    public Completable changeUserPassword(String newPassword){
        return firebaseAuthRepositoryType.getCurrentUser()
                .flatMapCompletable(firebaseUser -> {
                        firebaseAuthRepositoryType.changeUserPassword(firebaseUser, newPassword);
                        return Completable.complete();
                })
                .observeOn(AndroidSchedulers.mainThread());
    }
}

Вот тест, который я написал:

@RunWith(JUnit4.class)
public class ChangeUserPasswordInteractorTest {

    @Mock
    FirebaseAuthRepositoryType firebaseAuthRepositoryType;
    @Mock
    FirebaseUser firebaseUser;

    @InjectMocks
    ChangeUserPasswordInteractor changeUserPasswordInteractor;

    @Before
    public void setUp() throws Exception {
        MockitoAnnotations.initMocks(this);
        RxAndroidPlugins.reset();
        RxAndroidPlugins.setInitMainThreadSchedulerHandler(schedulerCallable -> Schedulers.trampoline());
    }


    @Test
    public void changeUserPassword() {
        Mockito.when(firebaseAuthRepositoryType.getCurrentUser()).thenReturn(Observable.just(firebaseUser));
        Mockito.when(firebaseAuthRepositoryType.changeUserPassword(firebaseUser, "test123")).thenReturn(Completable.complete());
        changeUserPasswordInteractor.changeUserPassword("test123")
                .test()
                .assertSubscribed()
                .assertNoErrors()
                .assertComplete();
    }
}

Проблема, с которой я столкнулся, заключается в том, что этот тест завершается без ошибок, даже если я меняю пароль с «test123» при вызове changeUserPassword на что-то другое, или если я в mock возвращаю «Completable.onError (new Throwable ()» )».

Я не могу понять это поведение. Любые предложения, как настроить тест?

1 Ответ

1 голос
/ 02 мая 2019

Последняя строка вашего flatMapCompletable всегда возвращает Completable.complete()

должно быть:

firebaseAuthRepositoryType.changeUserPassword(firebaseUser, newPassword);

так:

public Completable changeUserPassword(String newPassword){
            return firebaseAuthRepositoryType.getCurrentUser()
                    .flatMapCompletable(firebaseUser -> 
                        firebaseAuthRepositoryType.changeUserPassword(firebaseUser, newPassword));
        }
...