在具有自举模块的Gradle多模块项目中,我无法使用MockMvc,因为它需要引用自举模块。我不确定是否配置错误。基本结构是:
我使用以下配置在Spring-Boot 2.3.1.RELEASE和Gradle 6.4 上的github上建立了一个最小示例:
./settings.gradle.kts
rootProject.name = "spring-multimodule-integrationtest"
include("starter", "module")
./build.gradle.kts
subprojects {
repositories {
jcenter()
}
dependencies {
apply(plugin = "java-library")
"testImplementation"("junit:junit:4.12")
}
}
./starter/build.gradle.kts
plugins {
id("org.springframework.boot") version "2.3.1.RELEASE"
}
dependencies {
implementation(project(":module"))
}
./module/build.gradle.kts
dependencies {
testImplementation(project(":starter"))
}
该起动 -模只包含一个单级“入门”引用模块 -模块:
public class Starter {
public String info() { return "starter"; }
public static void main(String[] args) {
System.out.println(new Starter().info() + " and " + new Module().info());
}
}
该模块 -module(*感叹我应该为这个模块选用不同的名称)只包含这个实行类:
public class Module {
public String info() { return "module"; }
}
此外,模块 -module具有以下测试类来进行集成测试:
public class IntegrationTest
{
@Test public void testSomeLibraryMethod() {
final ByteArrayOutputStream out = new ByteArrayOutputStream();
System.setOut(new PrintStream(out));
Starter.main(new String[0]);
assertEquals("starter and module\n", out.toString());
}
}
在“ ./starter/build.gradle.kts”中应用spring-boot-plugin之前,这段代码可以正常运行。当任务“干净测试”在外壳上发出时,我得到:
❯ ./gradlew clean test
> Task :module:test FAILED
de.kramhal.multi.IntegrationTest > testSomeLibraryMethod FAILED
java.lang.NoClassDefFoundError at IntegrationTest.java:17
Caused by: java.lang.ClassNotFoundException at IntegrationTest.java:17
1 test completed, 1 failed
在IDE(准确地说是IntelliJ)中执行测试时,不会发生此问题。
我已经尝试按照此答案(以及其他几个答案)中的建议使用spring-dependency-management,但未成功。
我做错了什么?
首先,我建议您对项目进行重组,以确保您没有周期性的依赖关系。现在,要构建starter
,您需要构建module
。为了进行测试module
,您需要构建starter
。Gradle可以做到,但是通常是一种气味。
在故障排除方面:当您遇到这样的测试失败时,请查看测试报告,因为它具有完整的堆栈跟踪。您应该看到它抱怨找不到Starter
类(Caused by: java.lang.ClassNotFoundException: de.kramhal.multi.Starter
),这是starter
模块中的原因。
您提到了spring-dependency-management
插件,但这仅与管理Maven依赖项有关,而与这样的项目依赖项无关。因此,这里没有帮助。
我不确定这是否特定于Windows,因为我记得有很多类时会讨论性能问题。但是我相信该java-library
插件会在其他项目中查找jar文件,而不是用于已编译类的文件夹。这对您来说是个问题,因为该spring-boot
插件默认情况下将禁用标准jar
任务,而是通过该bootJar
任务创建一个“胖” jar文件。因为您既需要胖jar来打包应用程序以独立运行,又需要普通jar来将其作为依赖项使用,所以您需要对starter
项目进行一些调整(Kotlin DSL):
tasks {
jar {
enabled = true
}
bootJar {
archiveClassifier.set("boot")
}
}
这将启用普通的jar文件,但是由于名称将与bootJar
任务生成的名称冲突,因此您需要重命名其中的一个。我选择重命名bootJar
一个。
我不知道为什么该测试在IntelliJ中对您有效,因为默认情况下,应将所有内容委托给Gradle。但是也许您使用的是旧版本,或者进行了一些手动配置,以使IntelliJ可以编译并运行测试。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句