Robolectric无法与UrbanAirship兼容。

3
我正在使用UrbanAirship接收推送,我能成功地接收到通知。我决定使用Robolectric为我的项目添加测试,并创建了一个简单的测试,如下所示。
@Config(emulateSdk = 18)
@RunWith(RobolectricTestRunner.class)
public class MyActivityTest {

    @Test
    public void test1(){
            assertTrue(true);
    }
}

并获得

测试1失败 java.lang.RuntimeException
Caused by: 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。有没有什么办法可以解决这个问题?


嗨,你解决了这个问题吗?我正在努力让这两个东西一起工作,但是遇到了困难 :( - jademcosta
3个回答

1
问题在于Robolectric没有正确实现Urban Airship用来确定提供程序是否正确添加到清单中的方法。只有在禁用“inProduction”时才会进行检查。您可以尝试将其设置为true进行测试。
您可以提供一个测试应用程序类,该类可以替代您实现takeoff的应用程序。然后,您可以选择不调用takeoff或尝试执行上面提到的“inProduction”更改。这是我快速找到的链接http://robolectric.blogspot.com/2013/04/the-test-lifecycle-in-20.html。希望它仍然相关。
如果您决定不调用takeoff,则在测试调用Urban Airship库的代码时可能会遇到NPE。一个快速的解决方案是将UAirship及其组件的模拟版本注入到要测试的类中。某些静态调用也可能需要takeoff,并且需要一个能够被模拟或存根的包装器。这不是问题的最优雅的解决方案,但它应该允许您开始测试。我们肯定会研究解决方案,以使测试变得更加容易。

0

你可以尝试在配置文件中设置清单(manifest)来看是否有帮助:

@Config(emulateSdk = 18, manifest = "/path/to/your/AndroidManifest.xml")
@RunWith(RobolectricTestRunner.class)
public class MyActivityTest {
...
}

0
你可以在应用程序类中使用try catch包装你的Urban Airship TakeOff代码, 这样当它没有被找到时就不会导致测试用例崩溃。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接