2014-01-14 89 views
0

我是單元測試的初學者。嘲笑類,Java

我想測試MyClass。在Apache Tomcat上運行的應用程序。

類:

MyClass extends Report { 
    public MyClass() { 
     super(); //exception in JUnit 
    } 

    public void doSomething() { 
     GetDataFromSQL(params); // I want to test this 
    } 
} 

Report { 
    public Report(){ 
     //this throws null pointer exception in my JUnit tests: 
     ServletContext sc = EnviromentWrapper.getServletContext(); 
    } 

    //necessary method for MyClass. This method uses also other methods in this class. 
    public AnyData GetDataFromSQL(params){} 
} 

你能很快解釋我如何嘲笑報告 - 這是複雜的階級,我想保持原來的代碼GetDataFromSQL方法。

或者我可能需要對Tomcat做些什麼嗎?

回答

2

將非網絡工件綁定到Web層是一個壞主意。

你的報告根本不應該知道servlet上下文。

模擬EnvironmentWrapper#getServletContext()返回可用的東西和/或模擬ServletContext提供您所需要的。

+0

我想測試MyClass,而不是報告(不是我的課程) – liquide

+0

@liquide然後用mockito,EasyMock等任意一個模擬庫來模擬報告。您明確表示您希望*保留「複雜的代碼」在'GetDataFromSQL'中,如果沒有進一步的信息很難解釋。 –

+1

@DaveNewton - 我認爲這是一種「靜態」方法。這會讓事情變得複雜一些,你可以使用功能模擬來設置返回值,然後「回放」它們,但普通的嘲諷無助於你。 –