2017-04-19 72 views
1

使用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]在使用Robolectric构建片段时无法找到资源ID

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

简约例如:

@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 { 
    } 

} 

回答

1

我已经为我的活动定义根系活力框架,所以我可以提供,对于Robolectric的FragmentController内FragmentManager交易:

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

在我的活动:

setContentView(R.id.my_activity_frame); 
+0

我不知道你可以在'create'方法中指定id。这解决了这个问题,谢谢!我现在意识到我已经阅读了Google上的错误javadoc(我读取了org.robolectric.util.FragmentController的javadoc而不是org.robolectric.android.controller.FragmentController)。 – LoPoBo

+0

请注意,正确的签名是'create(int contentViewId,Bundle bundle)':) – LoPoBo

0

经进一步调查中,我没有找到一个解决方法(虽然丑陋)。看来Robolectric预计活动视图层次结构中具有id 1的ViewGroup。我找到的解决方案是在活动的onCreate(Bundle)中写入findViewById(android.R.id.content).setId(1);(或者添加一个新的ViewGroup,并以编程方式将其设置为1)。这对于生产代码来说似乎是一件可怕的事情,尽管我做了一个测试子类。

public class MyTestableActivity extends MyActivity{ 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     findViewById(android.R.id.content).setId(1); 
    } 
} 
0

如果您使用默认RobolectricTestRunner运行,请确保您的res /文件夹与AndroidManifest.xml位于相同的位置。 我得到了解决问题的东西像

@RunWith(RobolectricTestRunner.class) 
@Config(manifest = "./path/AndroidManifest.xml") 
public class FragmentTest{ 
} 
0

我做其他的答案的变化解决了这个:

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

请注意,您也可以替代Activity.class一个静态的内部测试,只YourTestActivity.class也是如此。