0

我需要在我的 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 中工作,因此可能有一些设置可以在命令行构建中关闭此优化?

感谢您对此提出任何建议。

4

1 回答 1

0

在 Gradle 6.7.1 中,我必须将包含代码的目录包含到测试 sourceSets 中。之后来自 junit 的类加载器开始查看类并在枚举中返回它们。

sourceSets {
        test {
            java.srcDirs += ['src/main']
        }
    }
于 2021-06-21T17:40:36.317 回答