如何使用Spring Boot测试Maven模块项目

时间:2016-06-03 13:37:45

标签: java junit spring-boot maven-module

我已将基于Spring Boot的项目拆分为多个Maven模块。现在只有war-project包含一个入门类(有一个main方法,启动Spring),其他模块都是jar类型。

如果他们不包含启动器,我如何测试jar项目?

示例JUnit测试用例标题:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(StarterClassInDifferentProject.class)
...

3 个答案:

答案 0 :(得分:9)

我认为每个模块都应该提供上下文测试,因此您可以在早期找到有线和配置的问题,而不是依靠完整的应用程序测试来查找它们。

我在同一模块中使用测试应用程序类解决了这个问题。 确保此主要课程位于测试目录。

@SpringBootApplication()
@EnableAutoConfiguration()
public class TestApplication {

    public static void main(String[] args) {
        SpringApplication.run(TestApplication.class, args);
    }
}

您的上下文现在应该可以使用。

@RunWith(SpringRunner.class)
//@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
//@TestExecutionListeners({DependencyInjectionTestExecutionListener.class})
//@ContextConfiguration()
@ActiveProfiles(profiles = {Profiles.WEB_REST})
//@TestPropertySource("/config/rest.yml")
@WebMvcTest(EntityController.class)
@DirtiesContext
public class ServicesControllerTest {

    @Autowired
    private MockMvc mvc;

    @MockBean
    private Controller controller;

    @Test
    public void testAll() throws Exception {
        given(controller.process(null)).willReturn(null);

        mvc.perform(get("/").accept(MediaType.APPLICATION_JSON))
                .andExpect(status().isOk());
    }
}

答案 1 :(得分:3)

我解决了类似的情况。 我有一个包含两个模块的项目:

  1. 包含域和实用程序类的“lib”项目,
  2. 带有弹簧启动应用程序,模板,控制器等的“web”项目......
  3. 我想以spring-boot-test方式测试“lib”项目。

    首先,在pom.xml中包含范围为“test”的必需依赖项(在我的例子中还有H2数据库):

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <version>1.3.3.RELEASE</version>
            <scope>test</scope>
        </dependency>
        <!-- add also add this here, even if in my project it is already present as a regular dependency -->
         <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
            <version>1.3.3.RELEASE</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>1.4.191</version>
            <scope>test</scope>
        </dependency>
    

    出于测试目的,在“lib”项目的测试源中,我有一个充当我的测试配置的类

        package my.pack.utils;
    
        import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
        import org.springframework.boot.autoconfigure.domain.EntityScan;
        import org.springframework.boot.test.context.TestConfiguration;
        import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
    
        @TestConfiguration
        @EnableJpaRepositories(basePackages = {"my.pack.engine.storage", "my.pack.storage"})
        @EntityScan(basePackages = {"my.pack.storage", "my.pack.entity"})
        @EnableAutoConfiguration
        public class MyTestConfiguration
        {
    
        }
    

    这将设置H2数据库以测试应用程序的数据访问功能

    最后,只有在我认为有用的测试类中,我才将配置执行配置为使用测试配置(我并不总是需要这样做,但有时它很方便):

        @RunWith(SpringJUnit4ClassRunner.class)
        @ContextConfiguration(classes = MyTestConfiguration.class)
        public class TestAClassThatNeedsSpringRepositories
        {
            // tests...
        }
    

答案 2 :(得分:0)

问题是

  

如果他们不包含启动器,我如何测试jar项目?

我认为正确的答案是,你的jar子模块不应该与spring-boot上下文联合测试。

事实上,你的jar项目中的大多数测试都不应该使用RunWith(Spring ...) 它们应该是vanilla或使用模拟库,例如@RunWith(MockitoJUnitRunner.class)。

如果您阅读SpringApplicationConfiguration's javadoc

  

类级注释,用于确定如何为集成测试加载和配置ApplicationContext。

它被认为是集成测试。

除此之外,您还可以使用弹簧上下文(而不是弹簧启动)使用测试弹簧配置启动测试&#39;在你的jar子模块中。定义您的bean /资源并在测试中使用它。

  

@RunWith(SpringJUnit4ClassRunner.class)来   @SpringApplicationConfiguration(TestConfigInJarModule.class)

例如,我这样做是为了测试Spring数据存储库,使用测试弹簧配置(不依赖于spring-boot)。