如何让Gradle在运行测试之前为特定的测试目录执行自定义编译?

qyyhg6bp  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(109)

我使用kotlinpoet来自动生成一些工厂文件。在测试套件本身,我需要根据一些测试参数生成工厂,然后编译源文件并类加载它们,这样我就可以创建一个示例来进行进一步的测试。
我通过Gradle做了一些事情,但是当我尝试这样做时,我遇到了循环依赖的问题(有很好的理由):

// Custom task to pre-generate factories needed for tests
task generateFactories(type: JavaExec) {
    mainClass = "com.factories.GenerateTestFactories"
    classpath = sourceSets.test.runtimeClasspath
    doLast {
        println "Factory generation completed"
    }
}

compileTestKotlin.dependsOn(generateFactories)

test.dependsOn generateFactories

字符串
因此,我实际上需要它在测试根目录下的特定目录上进行第二次传递,以便我的测试可以类加载新编译的代码。

w46czmvw

w46czmvw1#

当您执行测试时,您处于一个Gradle任务中,该任务本身在一个单独的环境中执行代码。正如您所总结的那样,尝试从那里启动Gradle任务不会顺利。首先,您需要一个全新的Gradle调用。
或者,您可以生成源文件,重新编译并类加载新类,所有这些都在您的测试中进行,而无需Gradle的帮助。如果您有很多案例需要测试,那么您可能需要这样做,但这听起来很难。
我建议更可行的方法是:

  • 提前确定用于确定少量KotlinPoet生成的参数,或者让用户在运行测试之前将其提供给Gradle(可能通过命令行或配置文件)
  • 在一个或多个新Gradle任务中生成这些Kotlin文件(如果您希望在单独的最终编译中将新代码生成彼此隔离,请使用多个任务)
  • 如果整个测试套件需要所有这些,则将它们的输出添加到测试编译中,以便测试将依赖并拾取新代码
  • 或者,将测试分解为几个任务,并使每个测试编译依赖于它所需要的一个或多个任务,

相关问题