在一个Gradle多模块项目中,在它自己的模块中有bootstrapping,我无法使用MockMvc,因为它需要引用bootstrapping-module。我不确定我是否配置错误了什么。基本结构为:
我使用Spring-Boot 2.3.1.Release and Gradle6.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"))
}
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-module(*唉,我应该为这个模块选择一个不同的名称)只包含这个隐写类:
public class Module {
public String info() { return "module"; }
}
此外,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之前,此代码运行良好。当在shell上发出任务“clean test”时,我得到:
❯ ./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
我做错了什么?
首先,我建议重组您的项目,这样您就不会有循环依赖关系。现在,为了构建starter
,您需要构建模块
。为了测试模块
,您需要构建starter
。格雷德尔可以做到,但通常是一种气味。
在故障排除方面:当您遇到这样的测试失败时,请查看包含完整堆栈跟踪的测试报告。您应该看到它抱怨找不到starter
类(由:java.lang.ClassNotFoundException:de.kramhal.multi.starter
引起),这是starter
模块的原因。
您提到了spring-dependency-management
插件,但这只与管理Maven依赖关系有关,而不是像这样的项目依赖关系。所以在这里没有帮助。
我不完全确定这是否是Windows特定的,因为我记得有一段时间,当有很多类时,围绕性能进行了一些讨论。但是我相信java-library
插件将在其他项目中查找jar文件,而不是编译类的文件夹。这对您来说是个问题,因为spring-boot
插件默认情况下将禁用标准的jar
任务,而是通过bootjar
任务创建“fat”一个jar文件。因为既需要fat jar将应用程序打包以独立运行,也需要普通jar将其作为依赖项使用,所以需要对starter
项目(Kotlin DSL)进行一些调整:
kotlin prettyprint-override">tasks {
jar {
enabled = true
}
bootJar {
archiveClassifier.set("boot")
}
}
这将启用普通的jar文件,但由于名称将与bootjar
任务产生的名称冲突,因此需要重命名其中一个。我选择重命名bootjar
。
我不知道为什么在IntelliJ中测试适合您,因为默认情况下,它应该将所有事情委托给Gradle。但是也许您有一个旧版本,或者做了一些手动配置来让IntelliJ编译和运行您的测试。
我的问题是关于测试多模块Spring Boot应用程序。 我有一个多模块spring boot REST应用程序。应用程序的结构如下: 以上就是我的应用程序的结构。 SpringBootMainApplication是主要项目。SpringbootModule是SpringBootMainApplication中的子项目。“SpringBootMainApplication.war”WAR将在WA
我试图为一个Spring引导项目写一个集成测试。不幸的是,我对实现感到困惑。 下面是已尝试的示例代码段 问题 我是否需要一个单独的,带有注释以支持集成测试
我正在测试我的spring boot应用程序。我正在做集成测试,但由于url返回的响应无法jsonfied,测试一直失败。请帮忙。以下是测试功能: 错误:
尝试完成Spring Boot教程:https://Spring.io/guides/gs/spring-boot/#initial 以下是我的课程: 和pom.xml: 当我尝试使用以下命令运行它时:“mvn package&&java-jar target/gs-spring-boot-0.1.0.jar”,我得到的是: “-dmaven.home=C:\program files\jetbr
我有一个Spring Boot集成测试,其类定义如下。 我得到以下例外: 我的TestApplication类定义如下: properties-context.xml定义如下: 这从一个名为external.properties.的文件中读取,在我的外部属性文件中设置了属性'spring.main.allow-Bean-定义-覆盖=true'。我添加此项是因为当我运行应用程序时,出现了相同的异常,
我有一个通过Spring Boot2.0.0.M3使用Spring Webflux的应用程序。 我在运行测试用例时遇到以下错误, java.lang.IllegalStateException:无法加载ApplicationContext 使用WebFlux运行Spring Boot集成测试是否存在任何配置问题? 您可以从这里访问完整的演示项目。