0

我想更改.properties应该从哪个文件类获取它们。
我的课现在是这样的:

public class MyClass {

private String str;    

public MyClass() throws IOException {
    loadProperties();
}

private void loadProperties() throws IOException {
    Properties props = new Properties();
    props.load(getClass().getClassLoader().getResourceAsStream("my.properties"));

    str= props.getProperty("property");        
}

为什么测试我希望从另一个文件加载属性。
这是 apache camel 应用程序,所以我现在有这个:

public class ConverterTest {
    @Override
    protected RouteBuilder createRouteBuilder() throws Exception {
        return new MyClass(); //--> Here i must load from another file             
    }

    @Test
    // test    
}

这可以实现吗?

4

3 回答 3

1

只需将属性文件名传递给 MyClass 构造函数

public MyClass(String propsFile) throws IOException {
    loadProperties(propsFile);
}
于 2013-11-01T11:08:52.963 回答
0

你可以做一些事情:

public class MyClass {

private String str;    
private String path = "my.properties";

public MyClass() throws IOException {
    loadProperties();
}

protected void loadProperties() throws IOException {
    Properties props = new Properties();
    props.load(getClass().getClassLoader().getResourceAsStream(path));

    str= props.getProperty("property");        
}

然后,使用以下代码将测试添加到同一个包中:

myClass = new MyClass();
ReflectionTestUtils.setField(path, "otherpathto.properties");
myClass.loadProperties();

它涉及代码中的微小更改,但可能没什么大不了的……取决于您的项目。

于 2013-11-01T11:19:36.847 回答
0

可以说,最干净的解决方案是重构MyClass和删除对对象的依赖,Properties并通过构造函数注入所需的值。您的案例证明隐藏和硬编码的依赖项使测试复杂化。

读取属性文件并将值注入的责任MyClass可以推回给它的调用者:

public class MyClass {
    private final String str;    

    public MyClass(String strValue) {
        this.str = strValue;
    }

    // ...
}

public class ProductionCode {
    public someMethod() {
        Properties props = new Properties();
        props.load(getClass().getClassLoader().getResourceAsStream("my.properties"));
        String str = props.getProperty("property");

        MyClass obj = new MyClass(str);
        obj.foo();
    }
}

public class ConverterTest {
    @Test
    public void test() {
        String testStr = "str for testing";
        MyClass testee = new MyClass(testStr);
        testee.foo();
        // assertions
    }
}
于 2013-11-01T12:12:25.090 回答