我正在使用UrbanAirship接收推送,并且我可以成功接收通知。我决定使用robolectric将测试添加到我的项目中,并创建了一个简单的测试,如下所示。

@Config(emulateSdk = 18)
@RunWith(RobolectricTestRunner.class)
public class MyActivityTest {

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


并得到


  
    测试1失败
        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" />


如果我注释掉与城市飞艇有关的线路,则可以无错运行测试。
我正在使用AndroidStudio,urbanairship jar版本是4.0.2。
有没有什么办法解决这一问题 ?

最佳答案

问题在于Robolectric没有实施Urban Airship用来确定提供者是否正确在舱单中的方法。仅当在飞艇配置选项中禁用“ inProduction”时才选中此选项。在测试中,您可能可以将其设置为true。

您可以提供一个测试应用程序类,该类可以代替实现起飞的应用程序使用。然后,您可以不呼叫起飞,也可以尝试进行上述“ inProduction”更改。这是我很快找到的http://robolectric.blogspot.com/2013/04/the-test-lifecycle-in-20.html链接。希望它仍然有意义。

如果您决定不呼叫起飞,则在测试调用Urban Airship库的代码时可能会遇到NPE。一种快速的解决方案是将模拟版的UAirship及其组件注入到您要测试的类中。一些静态调用也可能需要起飞,并且需要具有能够被模拟或存根的包装器。这不是解决问题的最佳方法,但是它应该可以让您开始测试。我们一定会研究解决方案,以使将来的测试变得更加容易。

10-08 09:43