Android架构组件ViewModel - 如何在测试Activity上模拟ViewModel?

11

我正在尝试设置类似于GithubBrowserSample的UI测试,但看起来示例项目仅为Fragment提供了模拟的ViewModel,而没有Activity的示例。

以下是我的代码,我试图通过模拟ViewModel来测试Activity。 但是ViewModelonCreate()之前未被设置。

@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)
            }
        }
}

请问有人能帮我解决这个问题吗?


你能否也分享一些活动类的代码片段? - azizbekian
1个回答

3
JUnit中的@Rule在@Before方法之前设置,因此您的Activity在setUp()方法调用之前启动并开始其生命周期。为了避免这种情况,请在规则构造函数的第三个参数中传递false。这告诉它不要自动启动活动,因此您可以提前进行设置。
然后,在运行测试之前,您需要手动启动活动。您可以创建一个像val intent = Intent(InstrumentationRegistry.targetContext,MainActivity :: class.java)这样的意图,然后将其传递给activityRule.launchActivity(intent)。

我无法做到,因为activityRule.activity为空。 - Truong Nguyen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接