2012-10-04 115 views
4

我正在使用單元/集成測試開發Java Web應用程序。應用程序被部署到Jetty,並在運行Maven的集成測試階段時使用H2數據庫。我有一個從dao層調用的oracle函數,它無法遷移到H2 db,因此我想在運行測試用例的時候在代碼中模擬/跳過這部分代碼。如何在java中單元測試時跳過一段代碼

我想有一個標誌,可以告訴我是否在測試模式下運行應用程序,並將條件放入代碼中,但看起來並不像對我更清潔。請建議最佳方法來實現這一點。

回答

3

將Oracle本地調用解壓縮到單獨的類(可能是某些DAO)。將該DAO注入到使用它的類中。創建該DAO的第二個實現,而不是調用Oracle。在集成測試期間注入後一種實現。

避免您的代碼中的標誌。如果您使用的是Spring,請使用構建配置文件來選擇性地創建一個或另一個實現。

這就是依賴注入如何幫助你測試你的代碼:如果你想模擬系統的某個部分,只需注入模擬版本。

+0

優秀!這個對我有用。我使用Spring 3.1的來注入依賴於我運行應用程序的環境的依賴關係。然而,其他解決方案也取決於情況。 – Pankaj

+0

@Pankaj:所以你完全按照我的方式做到了這一點。很高興我能幫上忙。 –

1

請使用一些很好的Mocking框架,如mockitojMock或其他一些類似的模擬框架。

請注意:您可能需要重新考慮代碼以使其更易於測試。

1

如果問題確實是:

如何在Java

然後我給出的答案同意單元測試時,我跳過一段代碼。依賴注入,嘲諷框架絕對是真正的單元測試的正確途徑。

但是,如果問題是:

使用JUnit(或其他單元測試框架)

然後我想答案是,當我如何跳過一段代碼「這取決於」 。有時我使用JUnit進行集成測試 - 我在測試服務器上運行客戶端代碼片段,以幫助我省去通過GUI手動執行這些客戶端測試的麻煩。在這種情況下,我在我的基類使用的系統屬性,比如我有:

protected boolean skipTest() 
{ 
    String port = System.getProperty("jersey.test.port"); 
    // don't run this test unless developer has explicitly set the testing properties 
    // this is an integration test, not a unit test 
    return port == null; 
} 

然後在實際的測試類,它看起來像這樣:

// verify a successful login 
@Test 
public void testLogin() 
{ 
    if (skipTest()) 
     return; 

    // do real test 

所以,我的想法是,如果你真的不能重構你的DAO中的Oracle東西,然後你真的在做一個集成測試,在你的單元測試中有一個skipTest是可以的。