2017-10-08 71 views
0

有些情況下,根據某些環境條件,軟件的行爲會有所不同,例如文件是否存在於某個地方。在文件存在時使用不同行爲的單元測試

在我的情況下,我正在開發一個庫,它是根據類路徑中的配置文件進行配置的(並且如果配置文件不存在,則回退到默認行爲)。

我該如何測試這個班級? 我需要編寫測試,評估在下列情況下,該類:

  • 文件不上classpath中存在
  • 與含量的文件類路徑
  • 存在與內容B中的文件類路徑
  • 存在

但我不知道如何配置環境來證明所有這些。然後依次執行測試。

順便說一下,我使用的是Java,並且我在測試類路徑中都有JUnit和TestNG。


編輯: 其中的一個問題是,該配置文件駐留在類路徑中,所以如果正常的ClassLoader查找並加載它,它只要在同一個類加載器返回相同的內容。 我相信使用自定義ClassLoader進行測試非常複雜,它需要測試來驗證測試!

+1

請仔細閱讀我們的[SO問題清單(http://meta.stackoverflow.com/questions/260648/stack-溢出問題清單)來幫助你提出一個好問題,從而得到一個很好的答案。 –

+0

保持環境(文件系統,環境變量,網絡,時間/日期,數據庫)不在您的單元測試中。這是一個痛苦。只是嘲笑一切。 – Robert

+0

@Robert我想這樣做,但生產環境呢?在目標部署中,我需要檢查是否存在類路徑文件。它是否也需要測試中的行爲呢? –

回答

1

您可以使用您的測試創建的臨時文件來模擬出課程中的路徑。

ConfigurationTest.java:

import static org.hamcrest.Matchers.*; 
import static org.junit.Assert.*; 
import static org.junit.Assume.assumeThat; 

import java.nio.file.Files; 
import org.junit.Test; 

public class ConfigurationTest { 

    private Configuration config = new Configuration(); 

    @Test 
    public void testWithConfigFile() throws Exception { 
     config.configFile = Files.createTempFile("config_",".ini"); 
     config.configFile.toFile().deleteOnExit(); 
     assertFalse(config.isInDefaultMode()); 
    } 
    @Test 
    public void testWithoutConfigFile() throws Exception { 
     assumeThat(Files.exists(config.configFile), is(false)); 
     assertTrue(config.isInDefaultMode()); 
    } 
} 

Configuration.java:

import java.nio.file.Files; 
import java.nio.file.Path; 
import java.nio.file.Paths; 

public class Configuration { 

    Path configFile = Paths.get("config.ini"); 

    public boolean isInDefaultMode() { 
     return !Files.exists(configFile); 
    } 
} 
相關問題