Robolectric不与UrbanAirship合作

时间:2014-05-22 14:56:37

标签: android android-studio robolectric urbanairship.com

我正在使用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。 有没有什么办法解决这一问题 ?

3 个答案:

答案 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中。这样,它不会导致测试用例在找不到时崩溃。