2016-09-25 217 views
22

弹簧引导利用弹簧配置文件(http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-profiles.html),它允许为不同的环境配置不同的配置。 我使用此功能的一种方式是配置测试数据库以供集成测试使用。 然而,我想知道是否有必要创建我自己的配置文件“测试”,并在每个测试文件中明确激活此配置文件? 现在我做以下列方式:集成测试的弹簧引导默认配置文件

  1. (现在只是数据库名)创建的src/main /资源
  2. 写测试特定的配置有内部application-test.properties
  3. 在每个测试文件包括:

    @ActiveProfiles("test") 
    

是否有一个更聪明/更简洁的方式吗?例如一个默认的测试配置文件?

编辑1:这个问题涉及到Spring的引导1.4.1

回答

33

据我知道有没有直接解决您的要求 - 但是我可以提出一个建议,可以帮助。

您可以使用自己的测试注释,这是一个meta annotation,包括@SpringBootTest@ActiveProfiles("test")。所以你仍然需要专用的配置文件,但是不要在所有测试中散布配置文件定义。

此注释将默认为要测试的配置文件,您可以使用元注释覆盖配置文件。

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.TYPE) 
@SpringBootTest 
@ActiveProfiles 
public @interface MyApplicationTest { 
    @AliasFor(annotation = ActiveProfiles.class, attribute = "profiles") String[] activeProfiles() default {"test"}; 
} 
6

您可以将一个application.properties文件放到您的test/resources文件夹中。您设置了

spring.profiles.active=test 

这是运行测试时的默认测试配置文件。

+0

我用这个项目在我的测试用例中,如果我想避免设置@ActiveProfiles(“test”)。它不适合你吗? – Compito

+9

如果我创建'src/test/resources/application.properties'文件,运行测试时会忽略'src/main/resources/application.properties'内容。 – ciastek

19

另一种方式做,这是定义一个基础(抽象)测试类,您的实际测试类将延长:

@RunWith(SpringRunner.class) 
@SpringBootTest() 
@ActiveProfiles("staging") 
public abstract class BaseIntegrationTest { 
} 

混凝土试验:

public class SampleSearchServiceTest extends BaseIntegrationTest{ 

    @Inject 
    private SampleSearchService service; 

    @Test 
    public void shouldInjectService(){ 
     assertThat(this.service).isNotNull(); 
    } 
} 

这允许你提取更多而不仅仅是@ActiveProfiles注释。您还可以想象更多专门的基类用于不同类型的集成测试,例如数据访问层vs服务层,或功能特性(通用的@Before@After方法等)。

-1

在我来说,我有根据环境不同application.properties,是这样的:

application.properties (base file) 
application-dev.properties 
application-qa.properties 
application-prod.properties 

和application.properties包含属性spring.profiles.active挑选正确的文件。

对于我的集成测试,我创建了一个新的application-test.properties文件中test/resources并与@TestPropertySource({ "/application-test.properties" })注释这是谁负责挑选我想根据我的需要application.properties用于这些测试的文件