Ошибка пользовательского интерфейса эспрессо на ViewModelProviders.of - PullRequest
0 голосов
/ 12 июня 2018

Я пытаюсь написать эспрессо-тест в моем приложении.В приложении я использую кинжал 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()))
    }
}
...