首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何编写测试代码以测试异常处理代码?

如何编写测试代码以测试异常处理代码?
EN

Stack Overflow用户
提问于 2016-10-08 05:54:44
回答 3查看 530关注 0票数 3

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

代码语言:javascript
复制
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是可以的吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-10-08 07:54:28

解决这一问题的一种方法是:

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

这种方法表面上看起来像是“更多的工作”,但它可以导致更好的设计--当您分离关注点时;通过创建一个特殊的异常处理程序类,您也可以自己测试那个类!

票数 0
EN

Stack Overflow用户

发布于 2016-10-08 06:06:47

我猜想notifyJDBCConnection会调用某种通知框架,不管是电子邮件发件人还是其他人。如果您使用像莫基托这样的框架来模拟该组件,则可以验证是否已经对该组件进行了适当的调用。

票数 1
EN

Stack Overflow用户

发布于 2016-10-14 06:09:51

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

代码语言:javascript
复制
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){

        }
    }   
}

因此,测试类是:

代码语言:javascript
复制
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();
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39929176

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档