у меня этот тестовый класс работал с MockitoJUnitRunner
раньше, а затем я добавил RoboLectric
, теперь я использую RobolectricTestRunner
Итак, первое, что он попробовал, это запустить мои старые тесты, но просто сменить бегунаи тест сейчас всегда провалится.Я не очень понимаю, что здесь происходит, я просто пытаюсь заставить мой старый тест работать с RobolectricTestRunner
без остановки, используя Mockito
.
Мой код перед переходом на RoboLectric (TEST PASS SUCCESSFULLY)
@RunWith(MockitoJUnitRunner::class)
class LauncherViewModelTest {
companion object {
@ClassRule
@JvmField
val schedulers = RxImmediateeSchedulerRule()
}
@Rule
@JvmField
val rule = InstantTaskExecutorRule()
@Mock
private lateinit var mockContext: MyApplication
@Mock
private lateinit var mockedDatabase: MyDatabase
@Mock
private lateinit var session: Session
//
@Mock
lateinit var mockedDatabaseRxWrapper: DatabaseRxWrapper
/** Evaluated class **/
@InjectMocks
lateinit var launcherViewModel: LauncherViewModel
@Test
fun checkIfHasSessionSuccess() {
val sessionFlowable: Flowable<Session> = Flowable.fromCallable { session }
FieldSetter.setField(launcherViewModel,
launcherViewModel.javaClass.getDeclaredField("databaseRxWrapper"), mockedDatabaseRxWrapper)
doReturn(sessionFlowable).`when`(mockedDatabaseRxWrapper).getSession()
launcherViewModel.checkIfHasSession()
//$hasSession is a mutable live data
Assert.assertEquals(true, launcherViewModel.hasSession.value)
}
}
Мой код после перехода на RoboLectric: (DatabaseRxWrapper.getSession () всегда возвращает ноль, даже когда я использую Mockito.doReturn (). When ())
@RunWith(RobolectricTestRunner::class)
class LauncherViewModelTest {
companion object {
@ClassRule
@JvmField
val schedulers = RxImmediateeSchedulerRule()
}
@Rule
@JvmField
val rule = InstantTaskExecutorRule()
@get:Rule
val mockitoRule = MockitoJUnit.rule()
@Mock
private lateinit var mockContext: MyApplication
@Mock
private lateinit var mockedDatabase: MyDatabase
@Mock
private lateinit var session: Session
//
@Mock
lateinit var mockedDatabaseRxWrapper: DatabaseRxWrapper
/** Evaluated class **/
@InjectMocks
lateinit var launcherViewModel: LauncherViewModel
@Test
fun checkIfHasSessionSuccess() {
val sessionFlowable: Flowable<Session> = Flowable.fromCallable { session }
FieldSetter.setField(launcherViewModel,
launcherViewModel.javaClass.getDeclaredField("databaseRxWrapper"), mockedDatabaseRxWrapper)
doReturn(sessionFlowable).`when`(mockedDatabaseRxWrapper).getSession()
launcherViewModel.checkIfHasSession()
//$hasSession is a mutable live data
Assert.assertEquals(true, launcherViewModel.hasSession.value)
}
}
Тестируемый класс
class LauncherViewModel(application: Application) : AndroidViewModel(application) {
@Inject
lateinit var databaseRxWrapper: DatabaseRxWrapper
val hasSession: MutableLiveData<Boolean> = MutableLiveData()
val application by lazy { getApplication<MyApplication>() }
init {
application.getAppComponent()?.inject(this)
}
fun saveLocation(location: Location) = sharedPreferenceManager.saveLocation(location)
fun checkIfHasSession() {
databaseRxWrapper.getSession()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
hasSession.postValue(true)
}, {
hasSession.postValue(false)
})
}
}