You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 20:45:28