Android 机器人分子测量仪';我不能和城市航空公司合作

Android 机器人分子测量仪';我不能和城市航空公司合作,android,android-studio,robolectric,urbanairship.com,Android,Android Studio,Robolectric,Urbanairship.com,我正在使用UrbanAirship接收推送,我可以成功接收通知。我决定使用robolectric将测试添加到我的项目中,并创建了一个简单的测试,如下所示 @Config(emulateSdk = 18) @RunWith(RobolectricTestRunner.class) public class MyActivityTest { @Test public void test1(){ assertTrue(true); } } 得到 测试

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

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

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

测试1失败 java.lang.RuntimeException
原因:java.lang.IllegalStateException

当我用debug运行测试时,我注意到一个奇怪的错误

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。
有办法解决这个问题吗

您可以尝试在配置中设置清单,看看这是否有帮助:

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

问题是Robolectric没有实现城市飞艇用来确定供应商是否正确地在舱单中的方法。只有在飞艇配置选项中禁用“inProduction”时,才会选中此选项。您可以在测试中将其设置为true

您可以提供一个测试应用程序类,该类可以用来代替您实现起飞的应用程序。然后,您可以不调用takeoff,也可以尝试执行上面提到的“inProduction”更改。这是我很快找到的一个链接。希望它仍然相关


如果您决定不调用起飞,那么在测试调用城市飞艇库的代码时,您可能会遇到NPE。一个快速的解决方案是将UAirship的模拟版本及其组件注入到您试图测试的类中。一些静态调用可能也需要起飞,并且需要有一个能够被模拟或存根的包装器。这不是问题的最优雅的解决方案,但它应该允许您开始测试。我们一定会研究解决方案,使测试在未来变得更容易

您可以将城市飞艇起飞代码包装在应用程序类的try-catch中。这样,当未找到它时,它不会导致测试用例崩溃

嗨,你解决这个问题了吗?我很难让这两种方法协同工作:(