【问题标题】:Unit test always fail when class is run运行类时单元测试总是失败
【发布时间】:2023-03-06 12:47:01
【问题描述】:

当我运行这个类时,我总是在方法 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() {

    }
}

【问题讨论】:

  • 尝试将代码从 setup() 移动到测试中
  • @Eugene 你能给我更多解释为什么我必须将设置从@Before 更改为@Test
  • 我没有说你应该在测试之前切换。为了理解这个问题,我建议删除 fun setup() 并初始化测试中的所有内容。现在,您初始化 MainViewModel。 miMain 在 2 设置和测试中。您还使用全局对象,它们的状态在所有测试之间共享,因此很难在任何时间点跟踪状态
  • 稍后,当您解决问题时,您可以删除有趣的设置
  • setup() 用于初始化mock、viewmodel等,这里删除不是问题。

标签: android unit-testing kotlin mockito


【解决方案1】:

如果有错误请纠正我,但我认为你的问题是因为你正在设置

MainViewModel.mIMain = main

在创建您的视图模型实例之前,不应该如下所示?

mainViewModel = MainViewModel(mDummy)
mainViewModel.mIMain = main

【讨论】:

  • 我的方法verify_on_onError_is_called() 仍然通过测试。 MainViewMode.mImain = main 用于初始化从活动到视图模型的接口。所以这不是问题。
  • @Alibana 这不是真的——当返回或触发 null / nothing / 任何异常时,你的类可以有一个默认行为返回 onError。考虑这个答案并尝试一下。
  • 我已经更改了代码,并从另一个方法添加了侦听器。仍然得到同样的错误。我现在已经添加了我的完整代码。
猜你喜欢
  • 2017-02-26
  • 1970-01-01
  • 2023-04-04
  • 2020-01-01
  • 2019-02-19
  • 2011-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多