2017-04-19 16 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を指定できることに気づいていませんでした。これは、問題を解決します、ありがとう!私は今、私が間違ったjavadocをGoogleで読んだことを認識しています(私はorg.robolectric.android.controller.FragmentControllerの代わりにorg.robolectric.util.FragmentControllerのjavadocを読んでいます)。 – LoPoBo

+0

正しい署名は 'create(int contentViewId、Bundle bundle)'です。 – LoPoBo

0

。 Robolectricは、アクティビティビューの階層内にIDが1のViewGroupを想定しているようです。私が見つけた解決策は、アクティビティのonCreate(Bundle)findViewById(android.R.id.content).setId(1);と書き込むか(または新しいViewGroupを追加し、そのIDをプログラムで1に設定する)でした。これはプロダクションコードの中でtoにひどいもののように思えるので、私はテストのサブクラスを作った。

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

のようなものを使用して解決しまった は、私は他の回答の変化をすることによって、これを解決:あなたも、静的な内部テストのみのためActivity.classを置き換えることができ

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

注意をYourTestActivity.classも同様です。

関連する問題