繁体   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