2013-11-01 157 views
0

我想更改文件類從哪個文件類獲得它們。
我的班級現在這個樣子:Junit替換屬性

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的駱駝的應用程序,所以我有這個現在:

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

    @Test 
    // test  
} 

才能實現這一目標?

回答

1

只是通過屬性文件名MyClass的構造

public MyClass(String propsFile) throws IOException { 
    loadProperties(propsFile); 
} 
+0

它將如何有效的呢?我將僅使用此構造函數進行測試。但我想知道是否有可能做到這一點,而不需要添加任何東西到我的主類。 – qiGuar

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(); 

它涉及代碼的一個小小的改變,但它可能不是什麼大事......取決於你的項目。

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 
    } 
}