У меня есть SplashActivity
, который должен вести себя по-разному в зависимости от состояния входа пользователя (продолжить работу или войти в систему)
Я использую Dagger2
для ввода ViewModel
в Activity
,и Repository
в 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
и изменении значения переменной, чтобы изменить поведение фиктивной функции, ноЯ считаю, что должна быть лучшая практика.