java - 使用 Robolectric 进行单元测试时在片段类中调用 getString() 时出现 IllegalStateException
问题描述
在片段类中调用 getString() 时出现 IllegalStateException
Caused by: java.lang.IllegalStateException: Fragment SomeFragment{1df37025} (29efd1d0-77c1-4293-a0f6-b808c7559cf4)} not attached to a context.
at androidx.fragment.app.Fragment.requireContext(Fragment.java:805)
at androidx.fragment.app.Fragment.getResources(Fragment.java:869)
at androidx.fragment.app.Fragment.getString(Fragment.java:891)
一些片段代码
public void someMethod() {
getString(R.string.some_res)
}
测试代码
@Before
fun setUp() {
val activity = Robolectric.buildActivity(SomeActivity::class.java).create().get()
fragment = SomeFragment()
fragmentManager = activity.supportFragmentManager
val fragmentTransaction: FragmentTransaction = fragmentManager.beginTransaction()
fragmentTransaction.add(fragment, null)
fragmentTransaction.commit()
}
@Test
@Throws(Exception::class)
fun someTest() {
fragment.someMethod()
}
解决方案
我认为问题可能是fragmentTransaction.commit()
因为commit
是异步的,所以当someTest()
开始时,提交可能已经结束或没有结束。文档说:
提交不会立即发生
更换或应该解决问题commit
。从上面引用的相同文档中,该方法:commitNow
commitNowAllowingStateLoss
commit
同步提交此事务
推荐阅读
- python - 点击远离 tkinter.Enrry
- python - 反复构造和销毁上下文会报错 #1260
- php - Laravel 迁移不指定列类型
- javascript - 错误:JSON.parse 中位置 0 处的 JSON 中的意外标记 <
) 在 XMLHttpRequest.ajax.onreadystatechange - spring-boot - 当我升级到 Vue 2.6.0 时,为什么会收到“SyntaxError:字符类中的无效范围”?
- docker - Dockerfile COPY 从主机到容器有效,但是当 docker-compose.yml 使用卷时,容器中的文件对主机不可见
- sas - 用于 SAS 的 %CEM 宏:指定用于匹配的变量
- node.js - Node/Express:解压缩目录时模拟 req.files
- vbscript - 检查多台机器上正在运行的进程
- python - 清理文件夹列表,只保留每组文件夹中的顶级文件夹