我正在尝试设置类似于Github浏览器示例看起来示例项目只有模拟ViewModel
for Fragment
但不是一个例子Activity
.
这是我试图测试的代码Activity
通过嘲笑ViewModel
。但是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)
}
}
}
有人可以帮我解决这个问题吗?
JUnit @Rule
之前进行设置@Before
方法,因此您的活动在您之前启动并开始其生命周期setUp()
方法被调用。为了避免这种情况,请通过false
作为规则构造函数的第三个参数。这告诉它不要自动启动该活动,因此您可以提前进行设置。
然后,您需要在运行测试之前手动启动该活动。您可以创建一个意图,例如val intent = Intent(InstrumentationRegistry.targetContext, MainActivity::class.java)
然后将其传递给activityRule.launchActivity(intent)
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)