首页 > 解决方案 > 使用 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()
}

标签: javaandroidunit-testingkotlinrobolectric

解决方案


我认为问题可能是fragmentTransaction.commit()因为commit是异步的,所以当someTest()开始时,提交可能已经结束或没有结束。文档说:

提交不会立即发生

更换或应该解决问题commit。从上面引用的相同文档中,该方法:commitNowcommitNowAllowingStateLosscommit

同步提交此事务


推荐阅读