我有一个简单的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"
}
}