NullPointerExcepcion с Robolectric на Activity.onCreate()
Я использую Robolectric для тестирования Activity (FooActivity), которая расширяет BaseActivity, а BaseActivity расширяет Activity, но я получаю исключение NullPointerException в Activity.onCreate ()
FooActivity.java расширяет BaseActivity.java
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
}
BaseActivity.java расширяет активность
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
this.mActivityCreated = true;
mFragmentMgr = getFragmentManager();
this.setContentView(R.layout.main);
}
Тест: FooActivityTest
@Before
public void setUp() {
mActivity = new FooActivity();
}
@Test
public void test() {
Intent i = new Intent();
i.putExtra("isTesting", true);
mActivity.setIntent(i);
mActivity.onCreate(null);
}
ошибка
java.lang.NullPointerException
at android.app.Activity.onCreate(Activity.java:874)
at com.pdi.enjoy.activities.BaseActivity.onCreate(BaseActivity.java:129)
at com.pdi.enjoy.activities.FooActivityTest.onCreate(FooActivity.java:107)
at com.pdi.enjoy.activities.FooActivityTest.test(FooActivity.java:32)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:234)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
at org.robolectric.RobolectricTestRunner$1.evaluate(RobolectricTestRunner.java:175)
at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
2 ответа
Intent i= new Intent(Robolectric.application, FooActivity.class);
i.putExtra("isTesting", true);
FooActivity activity = Robolectric.buildActivity(FooActivity.class).withIntent(i).create().get();
Не вручную вызывать onCreate для активности. Robolectric позаботится об этом..
Отсюда вы можете делать любые другие тесты, используя нужный вам объект деятельности.
Похоже, что более ранняя версия Robolectric требовала явного вызова методов жизненного цикла, но более поздние могут сами обрабатывать вызовы жизненного цикла.
Кроме того, нужно было использовать activity.getApplication()
получить приложение, но похоже Robolectric.application
прямо сейчас доступно.
@dymmeh: Спасибо за ответ.