使用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 {
}
}
答案 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。