Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Android架构组件ViewModel – 如何在测试Activity上模拟ViewModel?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试设置类似于 GithubBrowserSample的UI测试,看起来示例项目只有Frag的模拟viewmodel而不是Activity的示例.

这是我的代码,我试图通过模拟viewmodel来测试Activity.但viewmodel未在Activity中的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)
            }
        }
}

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

解决方法

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

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

大佬总结

以上是大佬教程为你收集整理的Android架构组件ViewModel – 如何在测试Activity上模拟ViewModel?全部内容,希望文章能够帮你解决Android架构组件ViewModel – 如何在测试Activity上模拟ViewModel?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。