2016-03-01 72 views
0

我正在定製Spring Boot啓動器。在一個測試啓動器中,我想要做的是實現一個合成註釋,它將爲ApplicationContext添加額外的@Configuration類(並且可能在TestExecutionListener中使用此註釋)。例如:自定義註釋中的@ContextConfiguration是否可以合併?

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.TYPE) 
@ContextConfiguration(classes = AdditionalTestConfiguration.class) 
public @interface ComposedAnnotation { 
} 

和使用,在我的春天啓動集成測試:

@RunWith(SpringJUnit4ClassRunner.class) 
@WebIntegrationTest 
@SpringApplicationConfiguration(Application.class) 
@ComposedAnnotation 
public class SomeTest { 
} 

無繼承參與。不幸的是,它似乎沒有工作。我懷疑這是Spring Boot的東西,而不是Spring測試框架本身。

有什麼辦法可以達到預期效果嗎?

+0

FYI:'@ContextConfiguration(AdditionalTestConfiguration.class)'不會編譯。 '@ ContextConfiguration'中的'value'屬性是XML文件或Groovy腳本位置的String []。 –

+0

謝謝,爲了趕上。我從頭頂上打字。糾正。 –

回答

1

你說得對:這不是Spring Boot的問題。但這也不是spring-test的問題。

相反,這是Spring一般的預期行爲。有關詳細信息,請查看我對此問題的回答:@ActiveProfiles in meta annotation and on test class not working

總之,在單個測試類(直接或作爲元註釋)上聲明的兩個@ContextConfiguration註釋不能實現此目的。

但是,我只是想出了一個的技巧,這將允許你實現這一點。具體而言,您可以創建一個登錄一個或多個@Configuration類的ApplicationContextInitializer(ACI)。在您的註釋中,您可以註冊此ACI以註冊總是出現@Configuration類別。當實際使用組合註釋時,它可以像正常一樣聲明額外的@Configuration類。

我剛剛在this commit提交了一個工作示例。

基本上,代碼會是這個樣子:

@ContextConfiguration(loader = AnnotationConfigContextLoader.class, initializers = FooConfigInitializer.class) 
@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.TYPE) 
public @interface ComposedContextConfiguration { 

    @AliasFor(annotation = ContextConfiguration.class, attribute = "classes") 
    Class<?>[] value() default {}; 
} 
public class FooConfigInitializer implements ApplicationContextInitializer<GenericApplicationContext> { 

    @Override 
    public void initialize(GenericApplicationContext applicationContext) { 
     new AnnotatedBeanDefinitionReader(applicationContext).register(FooConfig.class); 
    } 
} 

而且你可以使用它像這樣:

@RunWith(SpringRunner.class) 
@ComposedContextConfiguration(BarConfig.class) 
public class InitializerConfiguredViaMetaAnnotationTests { /* ... */ } 

ApplicationContext將被從FooConfigBarConfig加載。

上面的例子顯然不使用Spring Boot,但同樣的原理也應該適用於@SpringApplicationConfiguration

問候,

山姆(Spring的TestContext框架的作者)

+0

感謝您解釋和分享可能的解決方法。儘管如此,我認爲這並不符合我的需求。 我想實現的是有辦法引入一些功能的嘲諷(*可選*)實現。即我使用Java 8 Clock bean來獲取datetime:ZonedDateTime.now(clock)。在我的一些IT中,我想使用具有特定價值的FixedClock。我想使用專用註釋(帶參數)來做到這一點(設置@Primary bean覆蓋默認值)。我嘗試以編程方式在TestExecutionListeners中添加主要bean,但是我遇到了問題。 對此有何建議? –

相關問題