Я пытаюсь написать эспрессо-тест в моем приложении.В приложении я использую кинжал 2 и компоненты архитектуры (LiveData и т. Д.).Тест имеет функцию, которая помогает мне создавать поддельные инъекции для тестируемой активности.Когда я использую его для насмешки над ManViewModel, он работает без проблем и я могу запустить тест.Но когда я хочу установить фиктивное значение для ViewModelProvider.Factory, тест выдает ошибку в MainActivity: ViewModelProviders.of (th… iewModelImpl :: class.java) не должен быть нулевым
Я отладил тести когда я присваиваю фиктивное значение, оно не равно нулю, и в основном упражнении значения не равны нулю, а стали, я получаю ошибку.
Будет полезна некоторая помощь.
код для MainActivity:
class MainActivity : BaseActivity(), AnimateFactsImage {
@Inject
lateinit var viewModelFactory: ViewModelProvider.Factory
@Inject
lateinit var mainViewModel: MainViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
mainViewModel = ViewModelProviders.of(this, viewModelFactory).get(MainViewModel::class.java)
// Here is the error: ViewModelProviders.of(th…iewModelImpl::class.java) must not be null
}
}
код для MainActiviyTest:
@RunWith(AndroidJUnit4::class)
class MainActivityView {
@get:Rule
val activityTestRule = object : ActivityTestRule<MainActivity>(MainActivity::class.java, true, false) {
override fun beforeActivityLaunched() {
super.beforeActivityLaunched()
val myApp = InstrumentationRegistry.getTargetContext().applicationContext as MyApplication
myApp.activityDispatchingAndroidInjector = createFakeActivityInjector<MainActivity> {
mainViewModel = mainView
viewModelFactory = mockMPF // TODO: fix problem, null pointer in activity
}
}
}
private val mockMPF = Mockito.mock(ViewModelProvider.Factory::class.java)
private var mainView = Mockito.mock(MainViewModel::class.java)
private val repoLiveData = MutableLiveData<ApiResponse<Result>>()
@Before
fun setup() {
Mockito.`when`(mainView.getFactsList()).thenReturn(repoLiveData)
}
@Test
fun isListDisplayed() {
repoLiveData.postValue(ApiResponse(Result("title", arrayListOf(Row("title", "des", "img"))), null))
activityTestRule.launchActivity(null)
onView(withId(R.id.recycler_adapter)).check(matches(isDisplayed()))
}
}