我正在使用UrbanAirship接收推送,我可以成功接收通知。我决定使用robolectric将测试添加到我的项目中并创建一个简单的测试,如下所示。
@Config(emulateSdk = 18)
@RunWith(RobolectricTestRunner.class)
public class MyActivityTest {
@Test
public void test1(){
assertTrue(true);
}
}
并获取
test1失败 了java.lang.RuntimeException
引起:java.lang.IllegalStateException
当我使用调试运行测试时,我发现了一个奇怪的错误。
java.lang.IllegalStateException:无法解析UrbanAirshipProvider。请检查提供程序是否已在AndroidManifest.xml中定义,并且权限字符串设置为“YOUR_PACKAGENAME.urbanairship.provider”
我检查了我的清单,但看起来没什么不对。
<provider android:name="com.urbanairship.UrbanAirshipProvider"
android:authorities="com.test.myapp.app.urbanairship.provider"
android:permission="com.test.myapp.app.permission.UA_DATA"
android:exported="true"
android:multiprocess="true" />
如果我评论与urbanairship相关的行,我可以毫无错误地运行我的测试。 我使用的是AndroidStudio,urbanairship jar的版本是4.0.2。 有没有什么办法解决这一问题 ?
答案 0 :(得分:1)
问题是Robolectric没有实施Urban Airship用来确定提供商是否在清单中的方法。仅在&#34; inProduction&#34;中进行检查。在飞艇配置选项中被禁用。您可以通过将测试设置为true来逃避。
您可以提供一个测试应用程序类,可以代替您实现起飞的应用程序。然后你可以不打电话给起飞或者尝试做#34; inProduction&#34;变化如上所述。这是我很快找到的链接http://robolectric.blogspot.com/2013/04/the-test-lifecycle-in-20.html。希望它仍然相关。
如果您决定不拨打起飞,那么在测试调用Urban Airship库的代码时可能会遇到NPE。一个快速的解决方案是将模拟版本的UAirship及其组件注入您要测试的类中。一些静态调用也可能需要起飞,并且需要一个能够被模拟或存根的包装器。这不是问题最优雅的解决方案,但它应该允许您开始测试。我们一定会研究解决方案,以便将来更轻松地进行测试。
答案 1 :(得分:0)
您可以尝试在配置中设置清单,看看是否有帮助:
@Config(emulateSdk = 18, manifest = "/path/to/your/AndroidManifest.xml")
@RunWith(RobolectricTestRunner.class)
public class MyActivityTest {
...
}
答案 2 :(得分:0)
您可以将Urban Airship TakeOff代码包装在应用程序类的try catch中。这样,它不会导致测试用例在找不到时崩溃。