使用Gradle Spring Boot插件在测试文件夹中运行Spring Boot应用程序



我有一个简单的Spring Boot应用程序。当我运行gradle bootRun时,它会运行应用程序(大概是找到主类并运行它)。我还知道如何使用显式mainClass:配置bootRun任务

tasks.getByName<BootRun>("bootRun") {
mainClass.set("com.example.demo.Application")
}

现在,还有一个简单的额外要求;如何运行主类位于测试文件夹中的SpringBoot应用程序?我能想到的最好的是:

tasks.getByName<BootRun>("bootRun") {
mainClass.set("com.example.demo.test.UnderTest")
doFirst {
classpath += java.sourceSets["test"].runtimeClasspath
}
}

但我觉得不对。将test源代码集添加到类路径的正确方法是什么?我还尝试复制bootRun的实现(在org.springframework.boot.gradle.plugin.JavaPluginAction#configureBootRunTask中),但无法使其工作。

更多的上下文:test文件夹中的Spring Boot应用程序有点像主应用程序,但被配置为集成测试的主题。请注意,我知道SpringBootTest和Spring Test的功能。我正在为一个特定的需求寻找一种不同的方法:在执行一个测试时保持Spring应用程序的运行,使用Gradle的continue-build功能,其中Spring测试上下文缓存没有意义。

您可以通过添加一个新的Gradle自定义任务来尝试:

task startIntegrationApp(type: JavaExec) {
group = 'integration test'
classpath = sourceSets.test.runtimeClasspath
mainClass.set("com.example.demo.test.UnderTest")
}

如果您希望集成应用程序与主Spring Boot应用程序并行运行,则必须组合以下两项任务(确保集成应用程序在与主应用程序不同的端口上运行):

task startIntegrationApp(type: JavaExec) {
group = 'integration test'
classpath = sourceSets.test.runtimeClasspath
mainClass.set("com.example.demo.test.UnderTest")
}
Process process
task startIntegrationAppParallel() {
group = 'integration test'
doLast {
def builder = new ProcessBuilder("CMD", "/C", "gradlew", "startIntegrationApp")
stubProcess = builder.start()
stubProcess.waitFor(10, TimeUnit.SECONDS) // Wait for the IntegrationApp to be ready
println "Started UnderTest app"
}
}

相关内容

  • 没有找到相关文章

最新更新