无法集成测试gradle多模块Spring-Boot-Application

加菲尔德:

在具有自举模块的Gradle多模块项目中,我无法使用MockMvc,因为它需要引用自举模块。我不确定是否配置错误。基本结构是:

  • 模块:一个模块,其中包含一些REST服务,并且在启动程序上需要testImplementation-Dependency
  • 入门者:引导程序模块,该模块应用了spring-boot-plugin并取决于模块

使用以下配置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,但未成功

我做错了什么?

比昂·维斯特(BjørnVester):

首先,我建议您对项目进行重组,以确保您没有周期性的依赖关系。现在,要构建starter,您需要构建module为了进行测试module,您需要构建starterGradle可以做到,但是通常是一种气味。

在故障排除方面:当您遇到这样的测试失败时,请查看测试报告,因为它具有完整的堆栈跟踪。您应该看到它抱怨找不到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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在集成测试期间,Spring Boot无法从application.properties中解析自定义属性

Spring Boot Application无法运行2个控制器的集成测试

基于Spring-Boot模块的集成测试

Spring Boot测试如何使用不同的application.properties进行集成测试

与Spring Boot的集成测试

Spring Boot Application jar无法运行

无法使用docker运行Spring Boot Application

测试模块(JPMS)中不存在 Spring Boot Application 类

如何将AWS Secret Manager与Spring Boot Application集成

Spring Boot中多战应用程序的集成测试

Spring Boot和Gradle多模块项目无法正确加载依赖项

Spring Boot Application无法从另一个模块注入Bean

Elasticsearch Spring Boot集成测试

User spring boot application as a Spring boot admin and client both

我应该测试Spring Boot Application的main()方法吗?

在Travis CI上进行Spring Boot Application测试构建失败

运行Spring Boot集成测试时无法加载ApplicationContext

无法使用 Spring Boot 和 Testcontainers 运行 DB 集成测试

多模块Spring Boot项目中的单元测试

Spring Boot测试多模块Maven应用程序

How to run Spring Boot Application as a Service?

Intelij Spring Boot 2 application.properties

Spring Boot 从 application.properties 读取值

如何运行Spring Boot Application as a Service?

Spring Boot Application启动后立即关闭

Spring boot wep application to IBM Websphere

Spring Boot邮件忽略application.properties

多模块Spring Boot项目中的Gradle依赖插件

Spring Boot的application.yml和application.properties