Android - Используйте разные макеты объектов, введенные в действие для каждого теста - PullRequest
0 голосов
/ 02 октября 2018

У меня есть SplashActivity, который должен вести себя по-разному в зависимости от состояния входа пользователя (продолжить работу или войти в систему)

Я использую Dagger2 для ввода ViewModel в ActivityRepository в ViewModel:

@Module 
abstract class ActivityBindingModule {

    @ContributesAndroidInjector
    abstract fun splashActivity(): SplashActivity

}

и:

class SplashViewModel @Inject constructor(
        private val usersRepository: UsersRepository
) : BaseViewModel<SplashState>(SplashState.LOADING) {

    private var isInit = false

    fun init() {
        if (isInit) return
        isInit = true

        addDisposable(usersRepository
                .isUserLogin()
                .subscribe({
                    state.value = if (it)
                        SplashState.CONTINUE_LOGIN_USER
                    else
                        SplashState.CONTINUE_NOT_LOGIN_USER

                    isInit = false
                }, {
                    message.value = it.message
                    state.value = SplashState.ERROR

                    isInit = false
                }))
    }
}

Я хочу реализовать автоматический тест Android для проверки реакции SplashActivity в соответствии со сценарием.Итак, я создал модуль, который макетирует мои репозитории в тестах:

@Module
class TestApplicationModule {
    @Provides
    fun provideUserRepository(): UsersRepository = mock(UsersRepository::class.java).apply { 
        `when`(isUserLogin()).then { /* it should return true or false depending on the running test */ }
    }
}

Как я могу передавать различные экземпляры макетов Repository объектов в ViewModel в зависимости от запущенного теста для реализации моеготесты , как показано ниже:

@RunWith(AndroidJUnit4::class)
@LargeTest
class SplashActivityTest {

    // ...

    @Test
    fun notLoginUserNavigateToLogin() {
        // Change mocked function behavior
        // ...
        Intents.intended(IntentMatchers.hasComponent(LoginActivity::class.java.name))
    }

    @Test
    fun loginUserNavigateToHome() {
        // Change mocked function behavior
        // ...
        Intents.intended(IntentMatchers.hasComponent(HomeActivity::class.java.name))
    }
}

Примечание: Решение, которое мне приходит в голову, заключается в использовании глобального object и изменении значения переменной, чтобы изменить поведение фиктивной функции, ноЯ считаю, что должна быть лучшая практика.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...