由于Robolectric是在项目开发过程中引入的,所以要跑起来时就遇到了各种问题,下面整理一下运行过程中个人遇到的问题和解决方法。
一、
现象:
java.lang.IllegalStateException: there must have been some overlap for resourceIdToResName! expected 4897 but got 4896
at org.robolectric.res.MergedResourceIndex.merge(MergedResourceIndex.java:25)
at org.robolectric.res.MergedResourceIndex.<init>(MergedResourceIndex.java:17)
at org.robolectric.res.RoutingResourceLoader.<init>(RoutingResourceLoader.java:22)
at org.robolectric.RobolectricTestRunner.createAppResourceLoader(RobolectricTestRunner.java:601)
at org.robolectric.RobolectricTestRunner.getAppResourceLoader(RobolectricTestRunner.java:585)
at org.robolectric.internal.ParallelUniverse.setUpApplicationState(ParallelUniverse.java:89)
at org.robolectric.RobolectricTestRunner.setUpApplicationState(RobolectricTestRunner.java:404)
at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:220)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.robolectric.RobolectricTestRunner$1.evaluate(RobolectricTestRunner.java:175)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
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)
解决方法:
这是是由于在部分的layout xml中,一些“android:id="@android :id/**"”导致的,具体原因和具体哪些xml导致,我不清楚。由于项目中多个xml使用了“@android:id/**”,为了程序的稳定和不遗漏任何地方,我把xml中所有不必要的“@android :id/**”改为“@+id/**”或者"@id/**"(注意:TabHost对象及其相关对象必选使用“@android :id/tabs”),同时把java文件对应的读取方法改掉。
二、Looper.getMainLooper()
现象:
Caused by: java.lang.NullPointerException
at org.robolectric.shadows.ShadowLooper.getMainLooper(ShadowLooper.java:59)
at android.os.Looper.getMainLooper(Looper.java)
at com.example.app.MyApplication.<clinit>(MyApplication.java:277) ... 25 more
解决方法:(去掉Looper.getMainLooper())
//private static Handler handler = new Handler(Looper.getMainLooper()) {
//for Robolectric Unit Test
private static Handler handler = new Handler() {
三、
现象:
java.lang.NullPointerException
at android.app.Activity.onCreate(Activity.java:874)
at com.example.activity.SplashScreenActivity.onCreate(SplashScreenActivity.java:39)
at com.example.activity.SplashScreenActivityTest.setUp(SplashScreenActivityTest.java:29)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)
at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:234)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.robolectric.RobolectricTestRunner$1.evaluate(RobolectricTestRunner.java:175)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
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)
private SplashScreenActivity activity;
@Before
public void setUp()
{
// activity = new SplashScreenActivity();
// Intent newIntent = new Intent();
// activity.setIntent(newIntent);
// activity.onCreate(null);
activity = Robolectric.buildActivity(SplashScreenActivity.class)
.create().get();
}