在spring-boot应用程序中覆盖application.properties以进行集成测试

时间:2016-04-19 13:02:57

标签: java spring junit spring-boot integration-testing

我有一个标准spring-boot应用程序,我想在生产环境中使用MS SQL数据库,而对于集成测试,我想使用h2数据库。问题是我无法找到,如何覆盖默认的application.properties文件。即使我试图遵循一些教程,我也没有找到正确的解决方案......也许我只是错过了一些东西......

主要班级:

@SpringBootApplication
@EnableTransactionManagement
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication .class, args);
    }
}

和带测试的课程:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = MyApplication.class)
@WebIntegrationTest
public class MessageControllerTest {

    @Autowired
    MessageRepository messageRepository;
    ...
    ...
    ...
    @Test
    public void testSomething(){
    ...
    ...
    ...
    ...
    }
}

所以问题是,如何在运行测试时强制spring-boot使用application-test.properties文件,而不是application.properties,这应该在运行时使用。

我尝试将@WebIntegrationTest注释替换为@TestPropertySource(locations="classpath:application-test.properties"),但结果为java.lang.IllegalStateException: Failed to load ApplicationContext

2 个答案:

答案 0 :(得分:2)

假设您的应用中有application-test.properties文件。

我是以两种方式做到的:

1.CLI JVM Args

mvn spring-boot:run -Drun.jvmArguments="-Dspring.profiles.active=test
  1. 将application-test.properties添加为活动配置文件。
  2. 在application.properties中添加spring.profiles.active=test,它将加载你的application-test.properties文件。

    1. 正如您在答案中指出的那样,使用特定的活动配置文件注释一个类测试(当我认为有大型测试类时,这不适合)@ActiveProfiles("test")

答案 1 :(得分:1)

实际上这很简单......经过几个小时的尝试,我意识到我只需要用@ActiveProfiles("test")注释来注释我的测试类。

    @ActiveProfiles("test")
    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringApplicationConfiguration(classes = MyApplication.class)
    @WebIntegrationTest
    public class MessageControllerTest {

        @Autowired
        MessageRepository messageRepository;
        ...
        ...
        ...
        @Test
        public void testSomething(){
        ...
        ...
        ...
        ...
        }
    }