Java 如何编写测试代码来测试异常处理代码?
我正在为遗留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
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和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调用。模拟它以引发异常并检查是否调用了模拟通知组件。