2012-07-14 55 views
1

我有一個EJB,我想單元測試它的公共方法。我正在測試EJB作爲pojo。所以我只是實例化它並調用公共方法。使用私有環境變量測試一個類的單元

問題是,公共方法設置一些glassfish環境屬性的環境變量是私人的。所以我不能在類之外設置它,當我只是爲環境對象調用該公共方法時,它會引發nullPointerException。

,我想測試具有類,

@Resource(name="NameServiceEnvironment") 
private Properties nameServiceEnvironment; 



    public void setup() { 

     // Set the environment. 
     Properties environment = new Properties(); 
     environment.setProperty("name.host", this.nameServiceEnvironment.getProperty(NAME_HOST)); 
     environment.setProperty("name.port", this.nameServiceEnvironment.getProperty(NAME_PORT)); 

...} 

所以現在nameServiceEnvironment它拋出空指針異常。

現在來自測試類,我剛剛實例化了上面的類並調用了setup方法。

謝謝。

+0

感謝唐的編輯。 – Sara 2012-07-14 01:46:05

回答

2

你總是可以訪問,甚至私人方法。在測試中使用反射來訪問私有屬性 - 設置它們並繼續使用它。

+0

我認爲只能通過反射訪問私有構造函數而不是私有方法。 – 2012-07-14 02:16:25

+0

錯誤 - 你可以通過反射訪問私人的一切 - 方法,ctors,數據成員,一切。 – duffymo 2012-07-14 02:40:56

+1

http://stackoverflow.com/questions/11483647/how-to-access-private-methods-and-private-data-members-via-reflection – 2012-07-14 12:56:30

1

你nameServiceEnvironment使用

@Resource(name="NameServiceEnvironment") 

所以你只需要確保你的測試環境有資源配置的(因爲它在Glassfish的環境一樣)設置。例如,你可以使用Spring。

2

當爲單元測試時,爲nameServiceEnvironment添加一個setter並注入自己的nameServiceEnvironment。基於

更新的評論

或者,你可以提取的屬性從準備咬了另一種方法,並在測試覆蓋它僞造出來。

public void setup() { 
    setupEnvironment();    
    ... 
} 

void setupEnvironment(){ //you would override this in your unit test 
    Properties environment = new Properties(); 
    environment.setProperty("name.host", this.nameServiceEnvironment.getProperty(NAME_HOST)); 
    environment.setProperty("name.port", this.nameServiceEnvironment.getProperty(NAME_PORT)); 
} 

嗯,不完全是假的。你在測試中簡單地繞過這一點。

+0

這就是我的想法。但是我的經理爲了隱私的原因說他不希望發生glassfish環境變量的setter或getter方法。 – Sara 2012-07-14 01:41:06

+1

那麼,不知道如何揭露二傳手隱私風險。無論如何,我已經更新了我的答案以包含替代方案。 – Liggy 2012-07-14 01:50:48

1

是否因爲nameServiceEnvironment沒有注入?這是Arquillian流行的原因之一。我用它幾個月來單元測試容器中的ejb,但它並不容易使用(至少對我而言)。使用arquillian,你可以完成所有的依賴注入,然後執行測試方法。我也用反射作爲另一個建議。取決於你使用的是什麼DI框架,你也可以將它配置爲一個測試來注入。如果你想這樣做

反射代碼:

public class ATest { 

@Test 
public void testEjb() throws Exception { 
    MyEJB myEjb = new MyEJB(); 
    Class<? extends MyEJB> cls = myEjb.getClass(); 
    Field field = cls.getDeclaredField("props"); 
    field.setAccessible(true); 
    field.set(myEjb, new Properties()); 
    myEjb.somePublicMethod(); 
} 
class MyEJB { 
    private Properties props; 
    public void somePublicMethod() { 
     System.out.println("props has: " + props); 
    } 
} 

}

+0

是的,我測試了上述。我仍然得到同樣的例外。也許是因爲我們已經將該私有變量設置爲Field,但是在類中是屬性類型。我不確定。 – Sara 2012-07-15 00:45:58