如何编写测试代码来测试我的异常处理代码?

时间:2016-10-08 05:54:44

标签: java unit-testing junit mockito junit4

我正在为遗留Java代码编写单元测试。现在我遇到了一个问题。下面是我要为其编写测试代码的class A

class A {

    public A(){

    }

    public void doSomething()throws DBException {
        try{
            //some code that might throw JDBCConnectionException 
        }catch(JDBCConnectionException e){
            notifyJDBCConnection()
        }catch(Exception e){

        }
    }   

    private void notifyJDBCConnection(){
        //do notification stuff
    }
}

现在说我是否需要测试在notifyJDBCConnection()被捕获时是否已执行方法JDBCConnectionException。解决这个问题的正确方法是什么?或者我应该为测试方法编写测试notifyJDBCConnection是否可以?

3 个答案:

答案 0 :(得分:1)

我认为notifyJDBCConnection会调用某种通知框架,无论是电子邮件发件人还是其他人。如果使用Mockito之类的框架模拟该组件,则可以验证是否已对所述组件进行了适当的调用。

答案 1 :(得分:0)

接近这个的一种方式:

  1. 您将处理该异常的责任放入其自己的类中。
  2. 然后使用依赖注入为您的类 A 提供该新类的对象。
  3. 现在您可以使用模拟框架(如EasyMock或Mokito)将该异常处理程序类的模拟实例传递给A.
  4. 最后,验证您的模拟对象是否看到了预期的调用。
  5. 这种方法可能看起来像表面上的“更多工作”,但它可以带来更好的设计 - 当你分开关注时;通过创建一个特殊的异常处理程序类,您也可以自己测试那个类!

答案 2 :(得分:0)

使用Mockito和JUnit的解决方案,采用GhostCat建议的设计:

class A {
    private final JDBCConnectionNotifier notifier;

    public A(JDBCConnectionNotifier notifier){
        this.notifier = notifier;
    }

    public void doSomething()throws DBException {
        try{
            //some code that might throw JDBCConnectionException 
        }catch(JDBCConnectionException e){
            notifier.notifyJDBCConnection()
        }catch(Exception e){

        }
    }   
}

所以测试课程应该是:

import static org.mockito.Mockito.*;
import org.junit.*;

class ATest {
    @Test
    public void shouldCallNotifierOnJDBCConnectionException() throws Exception {
        JDBCConnectionNotifier notifier = mock(JDBCConnectionNotifier.class);
        A a = new A(notifier);

        a.doSomething();

        verify(notifier).notifyJDBCConnection();
    }
}