【问题标题】:Android Architecture Component ViewModel - How to mock ViewModel on test Activity?Android 架构组件 ViewModel - 如何在测试 Activity 上模拟 ViewModel?
【发布时间】:2017-12-27 08:04:58
【问题描述】:

我正在尝试设置类似于 GithubBrowserSample 的 UI 测试,看起来示例项目只有模拟 ViewModel 用于 Fragment,但没有模拟 Activity

这是我试图通过模拟ViewModel 来测试Activity 的代码。但是ViewModel 没有在活动中的onCreate() 之前设置。

@RunWith(AndroidJUnit4::class)
class MainActivityTest {

    val viewModel = mock(MainViewModel::class.java)

    @Rule
    @JvmField
    val activityRule = ActivityTestRule<MainActivity>(MainActivity::class.java, true, true)

    private val liveData = MutableLiveData<Resource<Object>>()

    @Before
    open fun setUp() {
        activityRule.activity.viewModelFactory = createViewModelFor(viewModel)
        `when`(viewModel.liveData).thenReturn(liveData)
        viewModel.liveData?.observeForever(mock(Observer::class.java) as Observer<Resource<Object>>)
        liveData.postValue(Resource.success(Object()))
    }

    fun <T : ViewModel> createViewModelFor(model: T): ViewModelProvider.Factory =
        object : ViewModelProvider.Factory {
            override fun <T : ViewModel> create(modelClass: Class<T>): T {
                if (modelClass.isAssignableFrom(model.javaClass)) {
                    return model as T
                }
                throw IllegalArgumentException("unexpected model class " + modelClass)
            }
        }
}

有人可以帮我解决这个问题吗?

【问题讨论】:

  • 你也可以分享一些活动课的内容吗?

标签: android kotlin android-espresso android-architecture-components android-viewmodel


【解决方案1】:

JUnit @Rules 在 @Before 方法之前进行设置,因此您的活动在您的 setUp() 方法被调用之前启动并开始其生命周期。为避免这种情况,请将false 作为第三个参数传递给规则构造函数。这告诉它不要自动启动活动,因此您可以提前进行设置。

然后,您需要在运行测试之前手动启动活动。您可以创建类似val intent = Intent(InstrumentationRegistry.targetContext, MainActivity::class.java) 的意图,然后将其传递给activityRule.launchActivity(intent)

【讨论】:

  • 我做不到,因为activityRule.activity = null
猜你喜欢
  • 2021-01-06
  • 2021-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-12
  • 2018-12-01
  • 1970-01-01
  • 2018-01-12
相关资源
最近更新 更多