Android robolectric 测试清单合并问题(android 信标库)

Posted

技术标签:

【中文标题】Android robolectric 测试清单合并问题(android 信标库)【英文标题】:Android robolectric tests manifest merge issue (android beacon library) 【发布时间】:2016-05-18 19:32:02 【问题描述】:

我有一个简单的测试用例

@Config(constants = BuildConfig.class)
@RunWith(RobolectricGradleTestRunner.class)
public class BaseTest  

   @Test
   public void startEverTestSugarAppAsFirst() 
       BeaconManager.setsManifestCheckingDisabled(true);
   


不幸的是,跑步者遇到了 manifestmerger 问题

java.lang.RuntimeException: org.altbeacon.beacon.BeaconManager$ServiceNotDeclaredException: BeaconService 未在 androidManifest.xml 中正确声明。如果 使用 Eclipse,请验证您的 project.properties 有 manifestmerger.enabled=true

在 org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:256) 在 org.robolectric.RobolectricTestRunner.runChild(RobolectricTestRunner.java:193) 在 org.robolectric.RobolectricTestRunner.runChild(RobolectricTestRunner.java:56) 在 org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 在 org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 在 org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 在 org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 在 org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 在 org.robolectric.RobolectricTestRunner$1.evaluate(RobolectricTestRunner.java:159) 在 org.junit.runners.ParentRunner.run(ParentRunner.java:363) 在 org.junit.runner.JUnitCore.run(JUnitCore.java:137) 在 com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69) 在 com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:234) 在 com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:74) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:497) 在 com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) 造成的: org.altbeacon.beacon.BeaconManager$ServiceNotDeclaredException: BeaconService 未在 AndroidManifest.xml 中正确声明。如果 使用 Eclipse,请验证您的 project.properties 有 manifestmerger.enabled=true 在 org.altbeacon.beacon.BeaconManager.verifyServiceDeclaration(BeaconManager.java:786) 在 org.altbeacon.beacon.BeaconManager.(BeaconManager.java:252) 在 org.altbeacon.beacon.BeaconManager.getInstanceForApplication(BeaconManager.java:244) 在 com.lucyapp.client.Client.onCreate(Client.java:67) 在 org.robolectric.internal.ParallelUniverse.setUpApplicationState(ParallelUniverse.java:164) 在 org.robolectric.RobolectricTestRunner.setUpApplicationState(RobolectricTestRunner.java:421) 在 org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:252) ... 18 更多

我想知道是否有任何简单的解决方法。我一直在浏览 android 信标库测试文件夹和

BeaconManager.setsManifestCheckingDisabled(true);

没用

【问题讨论】:

你把那行放在哪里?这正是我为解决这个问题所做的。 test 中的第一行(与库 test 包中相同)。这是我的首要问题。 你认为这可能是一个应该在 github 上的新问题中提交的错误吗? 在 GitHub 中创建问题之前,让我们在此处进行更多故障排除。无论哪种方式,我都是会帮助你的人。请参阅下面的答案。 【参考方案1】:

BeaconManager 在调用BeaconManager.setsManifestCheckingDisabled(true); 之前以某种方式构建 诀窍是找出该行的放置位置,以便它首先执行。

查看堆栈跟踪,我看到 BeaconManager 是从第 67 行的 com.lucyapp.client.Client.onCreate 构造的:

...
org.altbeacon.beacon.BeaconManager.getInstanceForApplication(BeaconManager.java:244) at 
com.lucyapp.client.Client.onCreate(Client.java:67)
...

知道了这一点,也许您可​​以找出可以将BeaconManager.setsManifestCheckingDisabled(true); 行放在哪里,以便在com.lucyapp.client.Client.onCreate(Client.java:67) 之前调用它

【讨论】:

我也怀疑过。客户端是安卓应用程序。似乎我需要稍微重构我的代码才能使其正常工作。如果我在代码中禁用清单检查(只是为了测试),我会在 RangeNotifier 中收到另一个错误。如果我有新的东西会回到这里。

以上是关于Android robolectric 测试清单合并问题(android 信标库)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用robolectric对Android音频录制应用进行单元测试

Android:如何在 Robolectric 中测试 PDFView?

Android单元测试系列-Robolectric

Android单元测试系列-Robolectric

配置同时使用PowerMock和Robolectric对Android进行单元测试

使用 Robolectric ClassCastException 进行 Android 测试:android.app.Application 无法转换为 MyApplication