我正在为遗留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
是否可以?
答案 0 :(得分:1)
我认为notifyJDBCConnection
会调用某种通知框架,无论是电子邮件发件人还是其他人。如果使用Mockito之类的框架模拟该组件,则可以验证是否已对所述组件进行了适当的调用。
答案 1 :(得分:0)
接近这个的一种方式:
这种方法可能看起来像表面上的“更多工作”,但它可以带来更好的设计 - 当你分开关注时;通过创建一个特殊的异常处理程序类,您也可以自己测试那个类!
答案 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();
}
}