почему при использовании RobolectricTestRunner функция смоделированного объекта выбрасывает нули вместо поддельных данных? - PullRequest
0 голосов
/ 11 апреля 2019

у меня этот тестовый класс работал с 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)
                })
        }
    }

1 Ответ

0 голосов
/ 11 апреля 2019

Я обнаружил, что вам не нужно правило для переписывания конфигурации RX, если вы работаете с Robolectric

Таким образом, код работал после удаления этого класса:

companion object {
        @ClassRule
        @JvmField
        val schedulers = RxImmediateeSchedulerRule()
    }
...