![](/img/trans.png)
[英]get file from src/test/resources using getResourceAsStream()
[英]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");
基本上當你執行getClass()。getResourceAsStream時,它會在該類的包中查找該文件..所以如果你的PropertyReadingListener在com.company.listeners.PropertyReadingListener中,那么它將在com / company / listeners中查找屬性文件。
為了可測試性,我將一個InputStream傳遞給監聽器,這樣測試可以以一種方式創建輸入流,並且代碼中類的實際用戶可以傳入從getResourceAsStream返回的InputStream。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.