使用Robolectric构建片段时无法找到资源ID

时间:2017-04-19 14:34:42

标签: android android-fragments robolectric

使用Robolectric 3.3.2我正在尝试构建一个片段并将其附加到一个活动上。我尝试Robolectric.buildFragment(MyFragment.class, MyActivity.class).create()但我得到例外android.content.res.Resources$NotFoundException: Unable to find resource ID #0x1 in packages [android, com.my.package.for.android]

我还尝试单独构建活动和片段并使用片段管理器附加片段,但似乎片段自动附加到虚拟活动,因此我无法将其附加到我的活动中。

简约示例:

@RunWith(RobolectricTestRunner.class)
@Config(sdk = Build.VERSION_CODES.KITKAT, manifest = "./src/main/AndroidManifest.xml")
public class MyTest {

    @Test
    public void WorkingTest1() throws Exception {
        Robolectric.buildFragment(MyFragment.class).create();
    }

    @Test
    public void WorkingTest2() throws Exception {
        Robolectric.buildActivity(MyActivity.class).create();
    }

    @Test
    public void FailingTest() throws Exception {
        Robolectric.buildFragment(MyFragment.class, MyActivity.class).create();
    }

    public static class MyActivity extends Activity {
    }

    public static class MyFragment extends Fragment {
    }

}

4 个答案:

答案 0 :(得分:1)

我已经为我的Activity定义了一个根Activity框架,所以我可以为Robolectric的FragmentController中的FragmentManager事务提供它:

Robolectric
    .buildFragment(MyFragment.class, MyActivity.class)
    .create(R.id.my_activity_frame);

在我的活动中:

setContentView(R.id.my_activity_frame);

答案 1 :(得分:0)

经过进一步调查,我确实找到了解决方法(尽管很难看)。似乎Robolectric期望活动视图层次结构中具有id 1的ViewGroup。我找到的解决方案是在活动的public class MyTestableActivity extends MyActivity{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); findViewById(android.R.id.content).setId(1); } } 中编写Sheets("B").Range(Cells(X, Y), Cells(X, Y+ 3)).value = _ Sheets("A").Range(Cells(1, Z), Cells(1, Z+ 3)).value (或添加一个新的ViewGroup并以编程方式将其id设置为1)。这对于生产代码来说似乎是一件可怕的事情,所以我做了一个测试子类。

gnuplot> call BudgetRowStacked.gnu " "Fonctionnement" "2017" "545000"

答案 2 :(得分:0)

如果您使用默认的RobolectricTestRunner运行,请确保您的res /文件夹与AndroidManifest.xml位于同一位置。 我用

之类的东西解决了这个问题
@RunWith(RobolectricTestRunner.class)
@Config(manifest = "./path/AndroidManifest.xml") 
public class FragmentTest{
}

答案 3 :(得分:0)

我通过改变其他答案来解决这个问题:

Robolectric
    .buildFragment(YourFragment.class, Activity.class)
    .create(android.R.id.content, new Bundle());

请注意,您也可以将Activity.class替换为静态内部仅测试的YourTestActivity.class。