Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何编写测试代码来测试异常处理代码?_Java_Unit Testing_Junit_Mockito_Junit4 - Fatal编程技术网

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

Java 如何编写测试代码来测试异常处理代码?,java,unit-testing,junit,mockito,junit4,Java,Unit Testing,Junit,Mockito,Junit4,我正在为遗留Java代码编写单元测试。现在我遇到了一个问题。下面是我想为其编写测试代码的A类 class A { public A(){ } public void doSomething()throws DBException { try{ //some code that might throw JDBCConnectionException }catch(JDBCConnectionException

我正在为遗留Java代码编写单元测试。现在我遇到了一个问题。下面是我想为其编写测试代码的
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
将调用某种通知框架,无论是电子邮件发送者还是其他人。如果使用类似的框架模拟该组件,则可以验证是否已对所述组件进行了适当的调用。

实现此目的的一种方法:

  • 您将处理该异常的责任放在它自己的类中
  • 然后使用依赖项注入将该新类的对象提供给类A
  • 现在,您可以使用模拟框架(如EasyMock或Mokito)将该异常处理程序类的mocked实例传递到一个
  • 最后,验证模拟对象是否看到预期的调用

  • 这种方法表面上看起来像是“更多的工作”,但它可以带来更好的设计——因为你需要分离关注点;通过创建一个特殊的异常处理程序类,您也可以自己测试该类

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

    为什么
    notifyJDBCConnection
    是公共的?是从另一个班级叫的吗?@saka1029是的,我想你是对的。它只从
    A类调用
    ,不应该是
    公共的
    。感谢您的惊喜接受;-)对那么,这是否意味着我不必编写测试代码来涵盖从
    try
    块到
    catch
    块(包括异常处理部分)的逻辑?我所要做的就是使用Mockito来测试通知组件,对吗?嗯,你需要让它以某种方式调用通知方法。它是否调用您也可以模拟的JDBC对象?您的意思是
    notifyJDBCConnection
    ?不,它只负责向其他组件发送消息。我的意思是,
    doSomething
    将在某个时候进行JDBC调用。模拟它以引发异常并检查是否调用了模拟通知组件。