如何用FragmentScenario+Espresso在测试类中获取Fragment的crime属性?
解决方法
步骤1:修改Fragment中crime属性的可见性
按照指南提示,首先需要移除crime属性的private修饰符,让测试类能够访问它。在Kotlin中推荐使用internal(同模块内可见)替代public,既满足测试需求又不会暴露给其他模块:
class CrimeDetailFragment : Fragment() { // ... 其他代码 ... // 将private改为internal internal lateinit var crime: Crime override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) crime = Crime( id = UUID.randomUUID(), title = "", date = Date(), isSolved = false ) } }
步骤2:在测试类中通过onFragment获取crime对象并断言
利用FragmentScenario.onFragment()方法拿到Fragment实例,直接访问其crime属性,同时获取EditText的内容进行对比:
@Test fun updatesCrimeAfterTextChange() { val testTitle = "newText" // 给EditText输入测试文本 onView(withId(R.id.crime_title)).perform(replaceText(testTitle)) // 注意:如果EditText是在失去焦点时才同步到crime,需要先让EditText失去焦点 // onView(withId(R.id.crime_title)).perform(closeSoftKeyboard(), clearFocus()) fragmentScenario.onFragment { fragment -> // 从EditText获取输入的文本 val editTextContent = fragment.binding.crimeTitle.text.toString() // 从Fragment获取crime的title属性 val crimeTitle = fragment.crime.title // 断言两者一致 assertEquals(testTitle, crimeTitle) assertEquals(editTextContent, crimeTitle) } }
指南原文翻译
例如,你可以测试并验证复选框和EditText是否已与你的Fragment关联,并能更新Crime对象。通过移除属性的private可见性修饰符,再使用FragmentScenario.onFragment(…)函数,你就能访问到Crime对象并执行相应的断言。
内容的提问来源于stack exchange,提问作者Viktor
相关产品推荐
相关产品推荐

