Прежде всего, убедитесь, что у вас установлена самая последняя fragment-testing
зависимость:
debugImplementation "androidx.fragment:fragment-testing:1.1.0-alpha05"
Дополнительная информация:
- Исправление было опубликовано в версии
1.1.0-alpha03
, поэтому предыдущие версии не будут работать, как описано здесь .
- Не забудьте использовать
debugImplementation
, иначе зависимость не будет работать правильно, благодаря этому , так что ответьте
- Если у вас есть ошибки, такие как
"process crashed, "No tests found.""
, проверьте, может ли помочь проблема .
После этого вы можете создавать фрагменты с помощью:
val bundle = Bundle()
....
launchFragmentInContainer(bundle, R.style.Theme_AppCompat) {
YourFragment()
}
//proceed here with espresso testing
Не забудьте R.style.Theme_AppCompat
в противном случае эспрессо рухнет
с ошибкой android.view.InflateException
, если вы используете виджеты из артефакта com.google.android.material:material
. Очевидно, что если вам нужен собственный стиль, вы можете добавить новое правило в файл styles.xml и сослаться на него здесь.
В моем случае я настроил Навигационный компонент , поэтому мне пришлось следовать предложению официальной документации здесь , чтобы убедиться, что navController в порядке с жизненным циклом.
Прежде всего я создал общий метод в моем TestFragmentUtils.kt
inline fun <reified F : Fragment> launchFragmentScenario(
bundle: Bundle?, fragment: F, navController: NavController): FragmentScenario<F> {
return launchFragmentInContainer(bundle, R.style.Theme_AppCompat) {
fragment.also { fragment ->
fragment.viewLifecycleOwnerLiveData.observeForever { lifeCycleOwner ->
if (lifeCycleOwner != null) {
// The fragment’s view has just been created
Navigation.setViewNavController(fragment.requireView(), navController)
}
}
}
}
}
Тогда в моем YourFragmentTest
я могу создать другой метод, например:
private fun launchMyFragmentScenario(bundle: Bundle?): FragmentScenario<MyFragment>
//viewModel factory can be easily injected if you use FragmentFactory
= TestFragmentUtils.launchFragmentScenario(bundle, MyFragment(viewModelFactory), navController)
и вызывайте его перед началом каждого теста. (navController
параметр смоделирован в методе @Before)