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

时间:2017-03-05 10:00:04

标签: java maven spring-boot dependencies spring-boot-test

我目前遇到弹簧启动和多个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() {...}

    }

1 个答案:

答案 0 :(得分:0)

您需要确保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

重复

同样引用托马斯在同一主题here

中的回答
  

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

     

例如,如果您的测试类的完全限定名称是   com.example.test.JpaTest和你申请的那个是   com.example.Application,然后您的测试类就能找到   @SpringBootApplication(其中,{。}}   @SpringBootConfiguration)。

     

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

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