使用多 Maven 项目设置测试 Spring Boot 应用程序的问题

Posted

技术标签:

【中文标题】使用多 Maven 项目设置测试 Spring Boot 应用程序的问题【英文标题】:Problems with Testing Spring Boot Application with Multi Maven Project Setup 【发布时间】:2017-07-25 05:14:50 【问题描述】:

我目前在 spring boot 和 multi maven 项目结构方面遇到了一些问题。我正在使用 Spring Boot 4.3.1。

我的项目结构如下:

parent
-- pom.xml
-- application
   -- pom.xml
   -- src
      -- main
         -- java
            -- Application.java (annotated with @SpringBootApplication)
      -- test
         -- java 
            -- MyApplicationTest.java (annotated with @SpringBootTest)
-- library
   -- pom.xml
   -- src
      -- main
         -- java (...)
      -- test
         -- java
            -- MyLibraryTest.java (annotated with @SpringBootTest)

application 模块依赖于library

MyApplicationTest 工作得非常好,但是运行 MyLibraryTest 时,我会失败并出现以下错误:

    java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...) with your test at org.springframework.util.Assert.state(Assert.java:392)
    at  org.springframework.boot.test.context.SpringBootTestContextBootstrapper.getOr FindConfigurationClasses(SpringBootTestContextBootstrapper.java:173)
    at org.springframework.boot.test.context.SpringBootTestContextBootstrapper.processMergedContextConfiguration(SpringBootTestContextBootstrapper.java:133)
    at org.springframework.test.context.support.AbstractTestContextBootstrapper.buildMergedContextConfiguration(AbstractTestContextBootstrapper.java:409)
    at org.springframework.test.context.support.AbstractTestContextBootstrapper.buildMergedContextConfiguration(AbstractTestContextBootstrapper.java:305)
    at org.springframework.test.context.support.AbstractTestContextBootstrapper.buildTestContext(AbstractTestContextBootstrapper.java:112)
    at org.springframework.boot.test.context.SpringBootTestContextBootstrapper.buildTestContext(SpringBootTestContextBootstrapper.java:78)
    at org.springframework.test.context.TestContextManager.<init>(TestContextManager.java:120)
    at org.springframework.test.context.TestContextManager.<init>(TestContextManager.java:105)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTestContextManager(SpringJUnit4ClassRunner.java:152)

我的第一个猜测是library 需要依赖application,但这会导致循环。

这个问题有什么解决办法吗? 如何正确构建我的应用程序?

非常感谢您的建议。

MyLibraryTest 如下所示:

    @RunWith(SpringRunner.class)
    @SpringBootTest
    @Transactional
    public class MyLibraryTest 
       @Autowired
       private MyService service;

       @Test
       public void testMyService_Save() ...

    

【问题讨论】:

请分享您发现错误的MyLibraryTest 的代码。此外,请确保它在其 pom 中定义了所有必需的依赖项。(如已在应用程序 -> pom.xml 中定义)为@SpringBootTest ***.com/questions/39084491/… 在这种情况下会有所帮助。可能是这个本身的副本。 【参考方案1】:

您需要确保library 模块的pom.xml 包含-

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-test</artifactId>
    <version>1.5.2.RELEASE</version>
</dependency>

这是模块使用@SpringBootTest注解所必需的。您可能已经在 app 模块中使用了相同的内容,但未包含在 library 模块中。


好吧发布编辑,发现问题可能与Unable to find a @SpringBootConfiguration when doing a JpaTest重复

还引用了同一线程中 Thomas 的回答,here

关于@DataJpaTest 和其他一些注释的事情是,它们 在当前包中寻找@SpringBootConfiguration注解, 如果他们在那里找不到它,他们会遍历包层次结构 直到他们找到为止。

例如,如果您的测试类的完全限定名称是 com.example.test.JpaTest 而你的应用程序是 com.example.Application,那么你的测试类就能找到 @SpringBootApplication(其中, @SpringBootConfiguration)。

如果应用程序驻留在包的不同分支中 然而,层次结构,如com.example.application.Application,它会 没找到。

对您来说似乎就是这种情况,您尝试在不同的模块本身中测试应用程序。因此,您会看到错误。

【讨论】:

@user3278695 如前所述,请编辑问题并分享MyLIbraryTest 的代码以进一步了解 那么你将如何解决这个问题?

以上是关于使用多 Maven 项目设置测试 Spring Boot 应用程序的问题的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot maven 多模块项目——单元测试(应用上下文)

如何在我的 Maven Spring Boot 多模块项目的测试中引用兄弟模块?

IntelliJ 在运行所有测试时不会刷新多模块测试中的 Spring 自动配置

如何正确设置 Maven Spring Boot 多模块项目?

使用 maven、spring、freemarker 等帮助设置 YUI Compressor 以适应不同的环境(测试/开发/生产)

Spring Boot 项目通过 Maven profiles 使用 -P 支持项目多环境配置打包