2013-07-26 10 views
13

Chcę przetestować działanie, do którego niektóre informacje są przekazywane w dodatkach.Robolektryczny: testowanie działania, oczekiwanie dodatków (wersja 2.X)

Intent intent = new Intent().putExtra("someData", "asdfgh"); 
activity = Robolectric.buildActivity(XYZ.class).withIntent(intent).create().get(); 

To wyrzuca następujący błąd:

java.lang.NullPointerException 
at android.app.Activity.attach(Activity.java:4993) 
at org.fest.reflect.method.Invoker.invoke(Invoker.java:112) 
at org.robolectric.util.ActivityController.attach(ActivityController.java:92) 
at org.robolectric.util.ActivityController$1.run(ActivityController.java:117) 
at org.robolectric.shadows.ShadowLooper.runPaused(ShadowLooper.java:256) 
at org.robolectric.util.ActivityController.create(ActivityController.java:114) 
at org.robolectric.util.ActivityController.create(ActivityController.java:126) 
at com.XXX.XXX.XYZTest.shouldDoBlah(XYZTest.java:XX) 
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) 
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) 
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 
at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:241) 
at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) 
at org.robolectric.RobolectricTestRunner$1.evaluate(RobolectricTestRunner.java:177) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:236) 
at org.junit.runner.JUnitCore.run(JUnitCore.java:157) 

Moje pytanie jest podobna do this w jakiś sposób. Jednak wydaje się, że odpowiedź jest nieaktualna. Byłoby dobrze działać w starszych wersjach Robolectric.

Odpowiedz

19

This odpowiedź wydaje się działać dla mnie. Czy jednak ktoś może to potwierdzić jako właściwy sposób postępowania. Ponieważ w poprzednich wersjach new Intent().putExtra(String, String) używane do pracy dobrze.

To co zrobiłem:

Intent intent = new Intent(Robolectric.getShadowApplication().getApplicationContext(), XYZ.class); 
intent.putExtra("foo", "bar"); 
XYZ xyz = Robolectric.buildActivity(XYZ.class).withIntent(intent).create().get(); 

Trzeba zdać kontekstu i klasy (chcesz przetestować) jako parametry intencji konstruktora. Mam nadzieję, że to pomaga.

Dla Roboelectric wersja 3.1 i nowsze

withIntent(intent) metoda jest przestarzała, zgodnie z zamiarem dokument powinien być przepuszczony przez konstruktora zamiast.

Robolectric.buildActivity(XYZ.class, intent).create().get(); 
+2

Ustawianie kontekst i klasa rozwiązały mój problem z NPE. – myanimal

+0

Dzięki tobie, bardzo mi pomagasz. – emaleavil

8

W robolectric 3.x sposób, aby uzyskać kontekstu aplikacji jest nieco inna:

 Intent intent = new Intent(ShadowApplication.getInstance().getApplicationContext(), 
       ViewTransactionActivity.class); 
     intent.putExtra(foo, bar); 
     activity = Robolectric.buildActivity(XYZ.class).withIntent(intent).create().get(); 
1

w 3,0 migawkę robolectric API jest zmienione na:

Bundle bundle = new Bundle(); 
    bundle.putString(Constants.PASSWORD_RESET_MESSAGE, ""); 
    intent.putExtras(bundle); 
    mTargetActivity = Robolectric.buildActivity(Target.class).withIntent(intent).create().get(); 
Powiązane problemy