Class.getResourceAsStream 在Robolectric 环境中无法return 更正M 平台中的流

Class.getResourceAsStream in Robolectric environment fails to return correct stream in M platform

我在 robolectric runner 中切换到 M 平台时遇到问题。

Class.getResourceAsStream 在使用 Build.VERSION_CODES.MBuild.VERSION_CODES.LOLLIPOP_MR1

时似乎表现不同

我的应用程序使用 PhoneUtils 库,该库使用以下代码加载其元数据:

static final MetadataLoader DEFAULT_METADATA_LOADER = new MetadataLoader() {
   @Override
   public InputStream loadMetadata(String metadataFileName) {
     return MetadataManager.class.getResourceAsStream(metadataFileName);
   }
};

配置测试时:

@Config(
        constants = BuildConfig::class,
        sdk = intArrayOf(Build.VERSION_CODES.M)
)

结果 JarUrlConnection 设置为:

sun.net.www.protocol.jar.JarURLConnection:jar:file:/C:/Users/motorro/.m2/repository/org/robolectric/android-all/6.0.0_r1-robolectric-0/android-all-6.0.0_r1-robolectric-0.jar!/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_US

(指 roboelectric platform mock)读取文件失败

如果配置为:

@Config(
        constants = BuildConfig::class,
        sdk = intArrayOf(Build.VERSION_CODES.LOLLIPOP_MR1)
)

结果 JarUrlConnection 设置为:

sun.net.www.protocol.jar.JarURLConnection:jar:file:/C:/Users/motorro/.gradle/caches/modules-2/files-2.1/com.googlecode.libphonenumber/libphonenumber/8.0.0/ce021971974ee6a26572e43eaba7edf184c3c63d/libphonenumber-8.0.0.jar!/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_US

指向正确的库文件(测试通过)。

这是测试:

@RunWith(RobolectricTestRunner::class)
class ExampleUnitTest {
    companion object {
        private val PHONE: Phonenumber.PhoneNumber

        init {
            PHONE = Phonenumber.PhoneNumber()
            PHONE.countryCode = 7
            PHONE.nationalNumber = 4956360636
        }
    }


    @Test
    @Config(
            constants = BuildConfig::class,
            sdk = intArrayOf(Build.VERSION_CODES.LOLLIPOP_MR1)
    )
    fun withLollipop() {
        PhoneNumberUtil.getInstance().format(PHONE, PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL)
    }

    @Test
    @Config(
            constants = BuildConfig::class,
            sdk = intArrayOf(Build.VERSION_CODES.M)
    )
    fun withM() {
        PhoneNumberUtil.getInstance().format(PHONE, PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL)
    }
}

这是机器人电气问题还是我在这里遗漏了一些配置?

现在的管道胶带解决方案@Config单独处理所有失败的测试。

当前依赖项:

    compile 'com.googlecode.libphonenumber:libphonenumber:8.0.0'
    testCompile 'junit:junit:4.12'
    testCompile "org.robolectric:robolectric:3.1.4"

Here是一个完整的测试项目,方便大家使用。

GitHub issue

问题已在 Robolectric 3.2.2

中修复