Junit替换属性

时间:2013-11-01 11:05:52

标签: java junit

我想更改.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");        
}

并且whyle测试我希望从另一个文件加载属性 它是apache camel应用程序,所以我现在拥有它:

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

    @Test
    // test    
}

这可以实现吗?

3 个答案:

答案 0 :(得分:1)

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

即可
public MyClass(String propsFile) throws IOException {
    loadProperties(propsFile);
}

答案 1 :(得分: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();

它涉及代码的一个小变化,但它可能不是什么大问题......取决于你的项目。

答案 2 :(得分: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
    }
}