如何编写测试代码来测试我的异常处理代码?
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 这样的框架模拟该组件,您可以验证是否已对所述组件进行了适当的调用。
一种方法:
- 您将 处理 该异常的责任归于其自身 class。
- 然后你使用依赖注入为你的classA提供一个新class的对象.
- 现在您可以使用 EasyMock 或 Mokito 等模拟框架将异常处理程序 class 的 模拟 实例传递给 A。
- 最后,您验证您的模拟对象是否看到了预期的调用。
这种方法表面上可能看起来像 "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();
}
}
我正在为遗留 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 这样的框架模拟该组件,您可以验证是否已对所述组件进行了适当的调用。
一种方法:
- 您将 处理 该异常的责任归于其自身 class。
- 然后你使用依赖注入为你的classA提供一个新class的对象.
- 现在您可以使用 EasyMock 或 Mokito 等模拟框架将异常处理程序 class 的 模拟 实例传递给 A。
- 最后,您验证您的模拟对象是否看到了预期的调用。
这种方法表面上可能看起来像 "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();
}
}