2012-04-27 175 views
1

我正在將所有Spring配置轉移到Java代碼。我遇到了一個問題,我現在想根據命令行開關或maven配置文件等來設置我正在使用的配置文件......我也想避免在每個測試中放置所有相同的註釋類。這不是一個Web應用程序,而是一個功能測試套件。Java Spring ApplicationContext配置

這裏是我的嘗試:

public class CompanyApplicationContextInitializer 
    implements ApplicationContextInitializer<ConfigurableApplicationContext> { 

    @Override 
    public void initialize(final ConfigurableApplicationContext applicationContext) { 
    final AnnotationConfigApplicationContext rootContext = new AnnotationConfigApplicationContext(); 
    rootContext.getEnvironment().setActiveProfiles(System.getProperty("spring.profile.active", "local")); 
    rootContext.register(LocalConfiguration.class, SauceLabsConfiguration.class); 
    } 
} 

然後,我必須標註有以下我的測試:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = CompanyApplicationContextInitializer.class) 

然而,當我嘗試運行我的測試,我的自動連接件不被定位。我在正確的軌道上嗎?我怎樣才能在這個類中編程來設置我的ApplicationContext?

回答

5

與你上面的例子的問題是,你傳遞一個ApplicationContextInitializer類@ ContextConfiguration#類。 #classes屬性旨在接受使用Spring的@Configuration註釋標記的類。

ApplicationContextInitializer主要用於Web應用程序,它很難獲得對WebApplicationContext的編程訪問。可以將「contextInitializerClasses」init-param傳遞給Spring DispatcherServlet,Spring將在適當的時候調用您的ACI實現,從而允許您在#refresh()之前操作應用程序上下文。

就你而言,看起來你只關心激活集成測試的配置文件。所以你的ACI是不必要的。使用Spring的@ActiveProfiles註釋標記您的集成測試,以指定哪些配置文件處於活動狀態。

請注意,如果spring.profiles.active已設置爲JVM系統屬性或環境變量,則指定的配置文件將自動激活。即不需要像在ACI實現中那樣調用System#getProperty。然而,有一點需要注意的是,根據ACI實現中的邏輯,如果spring.profiles.active是作爲系統屬性或環境變量提供的,則您希望回退到名爲「local」的配置文件。您可能有興趣知道有一個「保留的默認配置文件」字面意思是「默認」。這可能與您在「本地」配置文件中查找的語義相同。考慮將您的'本地'配置文件重命名爲'默認'。

最後,請注意,在@ContextConfiguration類中提供ApplicationContextInitializer支持確實存在一個開放式改進請求:https://jira.springsource.org/browse/SPR-9011。你可能想要關注一下。例如,如果沒有其他配置文件處於活動狀態,它將允許您以編程方式激活「本地」的簡單選項。

+0

我希望避免有一個基礎測試類,它定義了所有的配置選項,但它看起來像我不會有選擇(目前)。我希望避免必須在每個測試類上放置哪個配置文件處於活動狀態(這很容易在這裏使用JVM屬性完成),但我絕對希望避免必須在每個測試類上放置ContextConfiguration註釋,因此將其升級到基準測試將緩解該問題。 – Scott 2012-04-30 12:40:37

+0

@ActiveProfiles註解可以在基類中使用,它將應用於所有的子類。此外,該註釋具有許多屬性,包括一個名爲inheritLocations的屬性。看到Javadoc。 – 2012-07-13 19:38:35

1

嘗試增加你的應用程序上下文XML的位置到第二註釋:

@ContextConfiguration(locations = { 
    "classpath:applicationContext.xml" 
}) 
+0

當我在星期一得到它時會嘗試,但目前沒有xml文件。添加一個只是爲了聲明這個bean嗎?在其他地方使用所有的java配置時,似乎與直覺不符。 – Scott 2012-04-28 03:23:11

+0

不,請更改註釋,以便您的應用程序上下文在啓動時加載。 – duffymo 2012-04-28 13:10:48