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

How do I write test code for testing my exception handling code?

我正在为遗留 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
    }
}

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

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

一种方法:

  1. 您将 处理 该异常的责任归于其自身 class。
  2. 然后你使用依赖注入为你的classA提供一个新class的对象.
  3. 现在您可以使用 EasyMock 或 Mokito 等模拟框架将异常处理程序 class 的 模拟 实例传递给 A。
  4. 最后,您验证您的模拟对象是否看到了预期的调用。

这种方法表面上可能看起来像 "more work",但它可以带来更好的设计 - 因为您可以分离关注点;通过创建一个特殊的异常处理程序 class,您也可以自己测试 that class!

使用 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){

        }
    }   
}

所以测试 class 将是:

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