Подтвердить что ты не робот

Robolectric: тестирование активности, ожидающих дополнительных функций (версия 2.X)

Я хочу проверить действие, которому некоторая информация передается в дополнительных целях.

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

Он выдает следующую ошибку:

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)

Мой вопрос похож на этот в некотором роде. Однако ответ кажется устаревшим. Это было бы хорошо работать в более старых версиях Robolectric.

4b9b3361

Ответ 1

Этот ответ, похоже, работает на меня. Однако кто-то может подтвердить это как правильный способ. Потому что в предыдущих версиях new Intent().putExtra(String, String) работал нормально.

Это то, что я сделал:

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

Вам необходимо передать контекст и класс (вы хотите проверить) как параметры конструктора Intent. Надеюсь, что это поможет.

Для Roboelectric версии 3.1 +

withIntent(intent) метод устарел, поскольку намерение документа должно быть передано через конструктор.

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

Ответ 2

В robolectric 3.x способ получить контекст приложения немного отличается:

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

Ответ 3

В 3.0 снимке robolectric api изменяется на:

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