Модульный тест всегда терпит неудачу при запуске класса - PullRequest
0 голосов
/ 28 февраля 2020

, когда я запускаю этот класс, у меня всегда получался сбой теста в методе verify_on_success_is_called() с ошибкой,

На самом деле, с этим макетом было нулевое взаимодействие.

но если я запускаю только метод, тест будет пройден.

@Mock
lateinit var mDummy: Dummy

private lateinit var mainViewModel: MainViewModel

@Mock
lateinit var main: MainViewModel.IMain

@Before
@Throws(Exception::class)
fun setup() {
    MockitoAnnotations.initMocks(this)
    MainViewModel.mIMain = main
    RxAndroidPlugins.setInitMainThreadSchedulerHandler { Schedulers.trampoline() }
    mainViewModel = MainViewModel(mDummy)
}

@Test
fun verify_on_success_is_called() {
    val mockList: ArrayList<Employee> = ArrayList()
    mockList.add(Employee(1, "a", 20000.0, 22))
    val list: List<Employee> = mockList
    `when`(mDummy.getEmployees()).thenReturn(Observable.just(Response.success(list)))
    mainViewModel.getEmployees()
    Mockito.verify(main, times(1)).onSuccess()
}

@Test
fun verify_on_onError_is_called() {
    MainViewModel.mIMain = main
    `when`(mDummy.getEmployees()).thenReturn(Observable.error(Throwable()))
    mainViewModel.getEmployees()
    Mockito.verify(main, times(1)).onError()
}

это класс viewModel, который я хочу протестировать

class MainViewModel(private val mDummy: Dummy) : ViewModel() {

companion object {
    lateinit var mIMain: IMain
}

interface IMain {
    fun onSuccess()
    fun onError()
}

fun getEmployees() {
    mDummy.getEmployees()
        .observeOn(SchedulerProvides.main())
        .subscribeOn(SchedulerProvides.io())
        .subscribe({ response ->
            if (response.isSuccessful) {
                mIMain.onSuccess()
            } else {
                mIMain.onError()
            }
        }, {
            mIMain.onError()
        })
}

, и это мой класс mainActivity MainActivity: AppCompatActivity () {

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    MainViewModel.mIMain = mIMainViewModelIniliazed()
}

private fun mIMainViewModelIniliazed() = object :MainViewModel.IMain{
    override fun onSuccess() {

    }

    override fun onError() {

    }
}

1 Ответ

1 голос
/ 28 февраля 2020

Пожалуйста, исправьте меня, если я ошибаюсь, но я думаю, что ваша проблема в том, что вы устанавливаете

MainViewModel.mIMain = main

перед созданием вашего экземпляра viewmodel, не должно быть, как показано ниже?

mainViewModel = MainViewModel(mDummy)
mainViewModel.mIMain = main
...