2016-09-25 218 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用於這些測試的文件