我需要在我的 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 从命令行运行时失败(返回空枚举)。
我想知道两个 Gradle 版本在这方面有什么区别?为什么从 Studio 运行时它仍然有效?
我尝试过的一些注意事项和事情:
- 在单元测试中引用这些类可以正常工作,单元测试中的 classLoader.findClass("com.models.package.MyModel") 和 classLoader.loadClass("com.models.package.MyModel") 也可以正常工作。但即使在那之后 classLoader.getResources("com/models/package") 返回空枚举。
- 使用对 ClassLoader 的其他引用,例如 MyModel::class.java.classLoader 和 ClassLoader.getSystemClassLoader() 没有任何区别。
- 从命令行构建的 Gradle 包含警告“OpenJDK 64 位服务器 VM 警告:仅引导加载程序类支持共享,因为已附加引导类路径”,但据我所知,它与我的问题无关。
- 如果我将“com/models/package”中的一些类放到单元测试/test 文件夹中,它们将在枚举中返回。
这可能与一些新的优化设置有关,这些设置使 ClassLoaders 省略了在不同的根目录中注册某些类,但由于它仍然在 AS 中工作,因此可能有一些设置可以在命令行构建中关闭此优化?
感谢您对此提出任何建议。