我有一个在 Eclipse 中配置了 maven 的带有 Google Maps V2 的 Android 应用程序。所以我在 worspace 中有一个“mavenized”的 Google Play Services 库,并且应用程序 pom 对 google-play-services jar 和 apklib 有两个 maven 依赖项。
我实现了一个虚拟测试,它只检查地图片段是否不为空:
@RunWith(RobolectricTestRunner.class)
public class MapsTest {
private GoogleMap map;
private ElementMapActivity activity;
@Before
public void setUp() throws Exception {
activity = new ElementMapActivity();
activity.onCreate(null);
}
@Test
public void mapExists() {
// Try to obtain the map from the SupportMapFragment.
map = ((SupportMapFragment) activity.getSupportFragmentManager()
.findFragmentById(R.id.elementMap)).getMap();
Assert.assertNotNull(map);
}
}
注意:在实际的应用程序活动中使用了类似的代码来显示地图,并且运行正常。
我没有实现任何自定义测试运行器。
我用 maven 运行测试:mvn test。
使用 Robolectric 1.2,测试构建并执行,但 assertNotNull 失败,因为地图实例为空。片段未正确恢复。
使用 Robolectric 2.1.1 测试构建但无法执行。我为项目中的每个测试都得到了一个例外(不仅是测试地图的那个):
WARNING: no system properties value for ro.build.date.utc
java.lang.RuntimeException: .\..\google-play-services_lib\AndroidManifest.xml not found or not a file; it should point to your project's AndroidManifest.xml
at org.robolectric.AndroidManifest.validate(AndroidManifest.java:108)
at org.robolectric.AndroidManifest.getResourcePath(AndroidManifest.java:274)
at org.robolectric.AndroidManifest.getIncludedResourcePaths(AndroidManifest.java:280)
at org.robolectric.AndroidManifest.getIncludedResourcePaths(AndroidManifest.java:282)
at org.robolectric.RobolectricTestRunner.createAppResourceLoader(RobolectricTestRunner.java:576)
at org.robolectric.RobolectricTestRunner.getAppResourceLoader(RobolectricTestRunner.java:568)
at org.robolectric.internal.ParallelUniverse.setUpApplicationState(ParallelUniverse.java:89)
at org.robolectric.RobolectricTestRunner.setUpApplicationState(RobolectricTestRunner.java:387)
at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:227)
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.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:59)
at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.executeTestSet(AbstractDirectoryTestSuite.java:120)
at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.execute(AbstractDirectoryTestSuite.java:103)
at org.apache.maven.surefire.Surefire.run(Surefire.java:169)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:350)
at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:1021)
似乎 Robolectric 尝试使用 google-play-services 库清单而不是主应用程序清单,该清单位于默认位置:应用程序根文件夹。库清单也在它自己的根文件夹中。
我是否缺少一些测试配置?我应该使用自定义测试运行器吗?还是 Robolectric 2 不支持 Google Maps V2?
编辑:我可以不用地图测试。问题是,对于 Robolectric 2,所有其他测试也会出现此错误,只是通过具有 google-play-library 依赖项,所以我现在不能使用 Robolectric 2。我想知道这是否是一个已知错误,以便决定是否返回 Robolectric 1。我检查了 Robolectric 错误报告并没有找到任何关于此的内容。