当前位置: 首页 > 知识库问答 >
问题:

无法集成-测试分级多模块Spring-启动-应用程序

景志
2023-03-14

在一个Gradle多模块项目中,在它自己的模块中有bootstrapping,我无法使用MockMvc,因为它需要引用bootstrapping-module。我不确定我是否配置错误了什么。基本结构为:

  • 模块:包含一些REST服务的模块,需要依赖于starter的testImplementation-Dependency
  • starter:bootstrapping-module,用于应用spring-boot-plugin,并依赖于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

我做错了什么?

共有1个答案

寿浩言
2023-03-14

首先,我建议重组您的项目,这样您就不会有循环依赖关系。现在,为了构建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集成测试是否存在任何配置问题? 您可以从这里访问完整的演示项目。