Android: Gradle 更新到 6.7.1 ClassLoader 后 JUnit 测试不再列出所有资源
Android: after Gradle update to 6.7.1 ClassLoader in JUnit test no longer lists all resources
我需要在我的 android 单元测试中迭代主包中的特定 类,以检查它们的一些属性。
为此,我使用标准方法,使用 ClassLoader:
val classLoader = Thread.currentThread().contextClassLoader
val resources: Enumeration<URL> = classLoader.getResources("com/models/package")
assert(resources.hasMoreElements()) // Fails from CL, works in AS
在 Gradle 更新(有 Gradle 5.6.4)之前有效。现在的行为如下:当测试是来自 Android Studio 的 运行 时它有效,但是当使用 gradlew 从命令行 运行 时失败(returns 空枚举)。
我想知道两个 Gradle 版本在这方面可能有什么不同?为什么当来自 Studio 运行 时它仍然有效?
一些考虑和我尝试过的事情:
- 在单元测试中引用这些 类 工作正常,并且 classLoader.findClass("com.models.package.MyModel") 和
来自单元测试的 classLoader.loadClass("com.models.package.MyModel") 正在运行。但即使在那之后 classLoader.getResources("com/models/package") returns 空枚举。
- 使用其他对 ClassLoader 的引用,如 MyModel::class.java.classLoader 和 ClassLoader.getSystemClassLoader() 没有任何区别。
- Gradle 从命令行构建包含警告“OpenJDK 64 位服务器 VM 警告:仅引导加载程序 类 支持共享,因为已附加 bootstrap 类路径”,但据我所知,这与我的问题无关。
- 如果我将 'com/models/package' 中的一些 类 放入单元测试 /test 文件夹,它们将在枚举中返回。
这可能与一些新的优化设置有关,这些设置使 ClassLoader 忽略在不同的根目录中注册一些 类,但由于它在 AS 中仍然有效,因此可能有一些设置可以关闭此优化也在命令行构建中?
感谢您对此提出任何建议。
在 Gradle 6.7.1 中,我必须将包含代码的目录包含到测试 sourceSets 中。之后 junit 的类加载器开始在枚举中看到 类 和 return 它们。
sourceSets {
test {
java.srcDirs += ['src/main']
}
}
我需要在我的 android 单元测试中迭代主包中的特定 类,以检查它们的一些属性。 为此,我使用标准方法,使用 ClassLoader:
val classLoader = Thread.currentThread().contextClassLoader
val resources: Enumeration<URL> = classLoader.getResources("com/models/package")
assert(resources.hasMoreElements()) // Fails from CL, works in AS
在 Gradle 更新(有 Gradle 5.6.4)之前有效。现在的行为如下:当测试是来自 Android Studio 的 运行 时它有效,但是当使用 gradlew 从命令行 运行 时失败(returns 空枚举)。
我想知道两个 Gradle 版本在这方面可能有什么不同?为什么当来自 Studio 运行 时它仍然有效?
一些考虑和我尝试过的事情:
- 在单元测试中引用这些 类 工作正常,并且 classLoader.findClass("com.models.package.MyModel") 和 来自单元测试的 classLoader.loadClass("com.models.package.MyModel") 正在运行。但即使在那之后 classLoader.getResources("com/models/package") returns 空枚举。
- 使用其他对 ClassLoader 的引用,如 MyModel::class.java.classLoader 和 ClassLoader.getSystemClassLoader() 没有任何区别。
- Gradle 从命令行构建包含警告“OpenJDK 64 位服务器 VM 警告:仅引导加载程序 类 支持共享,因为已附加 bootstrap 类路径”,但据我所知,这与我的问题无关。
- 如果我将 'com/models/package' 中的一些 类 放入单元测试 /test 文件夹,它们将在枚举中返回。
这可能与一些新的优化设置有关,这些设置使 ClassLoader 忽略在不同的根目录中注册一些 类,但由于它在 AS 中仍然有效,因此可能有一些设置可以关闭此优化也在命令行构建中?
感谢您对此提出任何建议。
在 Gradle 6.7.1 中,我必须将包含代码的目录包含到测试 sourceSets 中。之后 junit 的类加载器开始在枚举中看到 类 和 return 它们。
sourceSets {
test {
java.srcDirs += ['src/main']
}
}