2010-02-12 246 views
1

我沒有編寫單元或集成測試,但現在我正在嘗試。我很難建立環境。彈簧單元/集成測試設置

我在我的應用程序上下文WEB-INF /的applicationContext * .XML 在我applicationContext.xml中,它爲DB用戶名/密碼,LDAP主機等爲特性的參考文件

<bean id="propertyConfigurer" 
      class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
     <property name="locations"> 
      <list> 
       <value>/WEB-INF/spring-config/dev.properties</value> 
      </list> 
     </property> 
    </bean> 

我有另一個log4j配置屬性(DEV配置/階段/生產)。 ${webapp.root}在web.xml中

<!-- log4j setting --> 
    <bean id="log4jInitialization" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> 
     <property name="targetClass" value="org.springframework.util.Log4jConfigurer" /> 
     <property name="targetMethod" value="initLogging" /> 
     <property name="arguments"> 
      <list> 
       <value>${webapp.root}/${log4j.properties.location}</value> 
      </list> 
     </property> 
    </bean> 

定義,現在我試圖把一個測試類以下。

@Override 
protected String[] getConfigLocations() { 
    return new String[]{ 
      "file:trunk/code/web/WEB-INF/applicationContext.xml", 
     }; 
} 

這引用我的xml正確,但所有的屬性都搞砸了。

我想了解以下內容:

  • 有沒有辦法在測試類設置是否正確?如果不是,我應該搬這些班嗎?
  • 如何設置Log4j是否存在對只存在於容器中的webroot的引用?
  • Spring配置位置的最佳實踐是什麼?

請告知

感謝

+1

難道你成功了嗎?分享它。 – Bozho 2010-02-23 21:04:25

回答

1

進行單元測試,你不應該使用Spring應用程序上下文。您應該單獨測試您的所有彈簧豆和控制器,因爲它們是系統內的各個單元。因爲它們是POJO,所以很容易以編程方式將所有內容連接在測試用例代碼中。也可以通過編程方式指定不依賴webroot屬性的不同路徑來解決日誌記錄屬性文件的位置等問題。

testing chapter在Spring參考提供瞭如何處理的使用Spring的應用程序單元和集成測試一個很好的概述。它還提供了Spring爲編寫單元和集成測試提供的各種支持類的詳細信息。

+1

如果您沒有單元測試的應用程序上下文,那麼您不能在測試裝置中使用彈簧注入各種bean。難道你不會錯過測試的一個重要方面嗎?或者你應該兩個都做? – HDave 2010-05-18 15:48:08

+1

我會說一個測試,你不使用應用程序上下文是一個單元測試,因爲你只測試這個單元,所以它沒有關係,因爲這些bean正在被編程注入。 如果您使用應用程序上下文,我會說這更像是一個集成測試,因爲您明確地測試瞭如何將所有東西放在一起。 – Mark 2010-05-18 21:57:46

+1

@HDave我會說你應該都這樣做。同意Mark關於單元測試和集成測試的區別。如果您需要使用上下文運行,則無法儘可能提高單元測試提供的反饋速度。最重要的是,你絕對不是在做TDD。不是你必須這樣做。只是說... – Crowie 2013-08-16 14:06:23

6

This blogpost of mine介紹基本的步驟,以實現自己的目標。

注意,單元測試不應該知道你有一個Web應用程序根 - 他們通常沒有任何servlet容器中運行啓動。因此,將替代配置文件放在測試包中,然後嘗試。

+0

這正是我最終做的。每個模塊都有單元測試和一個自定義的'test-application-context.xml'文件,單元測試通過Spring的'@ ContextConfiguration'註釋引用。真的很棒,能夠使用我們項目中每個Maven模塊所需的任何模擬測試裝置來設置上下文。對於集成測試,每個模塊都有一個不同的'integrationtest-application-context.xml',它引入來自所有相關模塊的bean。 – HDave 2013-08-16 15:13:23

1

你可以使用標註從測試中引用了必要的配置,這樣的:

@RunWith(SpringJUnit4ClassRunner.class) 
@TestExecutionListeners({ 
    DependencyInjectionTestExecutionListener.class, 
    DirtiesContextTestExecutionListener.class, 
    TransactionalTestExecutionListener.class }) 
@ContextConfiguration(locations = { 
    "file:../WebService/src/main/resources/application-context.xml", 
    "file:../ServiceLayer/src/test/resources/ServiceLayer-dao-test-context.xml" }) 
public class MyTest { 
    // class body... 
}