簡體   English   中英

從測試運行時,getResourceAsStream(“file”)在哪里搜索?

[英]Where is getResourceAsStream(“file”) searching when running from a test?

我正在努力創建一個測試來驗證加載屬性文件的ServletListener 我在運行應用程序時測試它運行正常,並在classpath找到該文件。 但我不知道如何為它創建測試。 我的想法是創建一個帶有test屬性的臨時文件,然后驗證該屬性是否已放入System properties 但我總是無法在正確的位置創建文件。

我嘗試在/target/test-classes創建文件,或者直接在應用程序的根目錄中創建文件,但它從未找到它。 任何的想法?

這是我試圖測試的代碼:

public class PropertyReadingListener implements ServletContextListener {

    public static final String PROFILES_PROPERTIES = "profiles.properties";

    @Override
    public void contextDestroyed(ServletContextEvent event) {
    }

    @Override
    public void contextInitialized(ServletContextEvent event) {
        Properties propsFromFile = new Properties();
        try {
            propsFromFile.load(getClass().getResourceAsStream(PROFILES_PROPERTIES));
        } catch (final Exception e) {
            log.warn("Unable to find {}, using default profile", PROFILES_PROPERTIES);
        }
        propsFromFile.stringPropertyNames().stream()
            .filter(prop -> System.getProperty(prop) == null)
            .forEach(prop -> System.setProperty(prop, propsFromFile.getProperty(prop)));
    }
}

謝謝。

從測試運行時,getResourceAsStream(“file”)在哪里搜索?

假設你在談論JUnit ....

除非你做了一些時髦的事情,否則你的單元測試將由默認的類加載器加載,這意味着要搜索正常的JVM類路徑。

(Junit 4允許您使用不同的類加載器:請參閱https://stackoverflow.com/a/9192126/139985


但我總是無法在正確的位置創建文件。

您的真正問題似乎是了解Java類路徑和類路徑搜索的工作原理。 如果您了解(並且您知道JUnit運行器的實際類路徑是什么)那么應該明確放置屬性文件的位置,以便類加載器可以找到它。

假設您正在使用maven,請將您的屬性文件放在此處:

src/test/resources/foo.properties

maven資源插件將放置文件的(可能已過濾的)副本

target/test-classes/foo.properties

test-classes目錄位於類路徑中,因此您可以像這樣引用文件(請注意文件名前面的斜杠):

... getResourceAsStream("/foo.properties");

請參閱將文件加載為InputStream的不同方法

基本上當你執行getClass()。getResourceAsStream時,它會在該類的包中查找該文件..所以如果你的PropertyReadingListener在com.company.listeners.PropertyReadingListener中,那么它將在com / company / listeners中查找屬性文件。

為了可測試性,我將一個InputStream傳遞給監聽器,這樣測試可以以一種方式創建輸入流,並且代碼中類的實際用戶可以傳入從getResourceAsStream返回的InputStream。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM