2014-01-14 88 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 - 我认为这是一种“静态”方法。这会让事情变得复杂一些,你可以使用功能模拟来设置返回值,然后“回放”它们,但普通的嘲讽无助于你。 –