2017-04-19 2 views
1

Verwenden von Robolectric 3.3.2 Ich versuche, ein Fragment zu erstellen und es an eine Aktivität anzuhängen. Ich habe versucht Robolectric.buildFragment(MyFragment.class, MyActivity.class).create(), aber ich bekomme Ausnahme android.content.res.Resources$NotFoundException: Unable to find resource ID #0x1 in packages [android, com.my.package.for.android].Ressource-ID beim Erstellen eines Fragments mit Robolectric nicht gefunden

Ich habe auch versucht, die Aktivität und Fragment separat zu erstellen und das Fragment mit dem Fragment-Manager anhängen, aber es scheint, dass das Fragment automatisch an eine Dummy-Aktivität angefügt ist, so kann ich es nicht an meine Aktivität anhängen.

Minimalistic Beispiel:

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

} 

Antwort

1

Ich habe einen Wurzelaktivität Rahmen bereits für meine Tätigkeit definiert, so kann ich, dass für die FragmentManager Transaktion innerhalb Robolectric des FragmentController liefern:

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

In meiner Aktivität:

setContentView(R.id.my_activity_frame); 
+0

Ich war mir bewusst, dass Sie die ID in der 'create' Methode angeben können. Dies löst das Problem, danke! Mir ist jetzt klar, dass ich das falsche Javadoc auf Google gelesen habe (ich habe javadoc für org.robolectric.util.FragmentController statt org.robolectric.android.controller.FragmentController gelesen). – LoPoBo

+0

Beachten Sie, dass die richtige Signatur 'create (int contentViewId, Bundle bundle)' ist :) – LoPoBo

0

Bei der weiteren Untersuchung ich eine Abhilfe gefunden haben (wenn auch hässlich). Es scheint, dass Robolectric eine ViewGroup mit der ID 1 in der Hierarchie der Aktivitätsansicht erwartet. Die Lösung, die ich fand, war findViewById(android.R.id.content).setId(1); in der Aktivität onCreate(Bundle) zu schreiben (oder eine neue ViewGroup hinzuzufügen und seine ID programmatisch auf 1 zu setzen). Dies scheint eine schreckliche Sache im Produktionscode zu sein, also habe ich eine Testunterklasse gemacht.

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

Wenn Sie mit dem Standard RobolectricTestRunner arbeiten, stellen Sie sicher, dass sich Ihr res/Ordner am gleichen Ort wie AndroidManifest.xml befindet. Ich habe das Problem mit so etwas wie

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

ich dies einer Variation von anderen Antworten, indem Sie beschlossen:

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

Beachten Sie, dass Sie auch Activity.class für einen statischen inneren Test nur ersetzen können YourTestActivity.class auch.

Verwandte Themen