我正在使用EasyMock创建一些junit测试用例。到目前为止,我希望返回POJO的类是有意义的,但是我应该如何处理本身可能抛出异常的DAO对象。我的测试用例是检查DAO遇到问题时抛出的预期异常。使用EasyMock我尝试模拟DAO对象(从foo
类进行测试),处理低级DAO异常的正确方法是什么。
类/简单调用的一个示例如下:(假设所有getter / setters /构造函数都有效且存在)
public class foo{
private daoClass dao = daoClass.getInstance();
public String getValueFromDB(String key) throws DBException{
return dao.lookup(key);
}
}
public class daoClass{ //singleton DAO
public daoClass getInstance(){
//singleton access here
}
public String lookup(String key) throws DBException{
try{
//DB LOGIC
}
catch(Exception e){
throw new DBException(e.getMessage());
}
}
}
当我尝试测试foo
类时,我希望能够测试此DBException。如果我在try / catch(测试中)中调用DAO调用,或者在测试中添加一个抛出,我该如何处理?我知道如果抛出测试,expected=DBException
会通过测试,但是你应该在句法上如何处理任何数量的内部异常?
测试代码示例:
@Test(expected=DBException.class)
public void testFooError(){
String key = "test";
String value = "expected";
daoClass daoMock = createMock(daoClass.class);
try{
expect(daoMock.lookup(key)).andReturn(value);
} catch (DBException e){
// ???
}
}
expect
可能导致错误的正确方法是什么?测试方法throw
应该是例外,还是应该使用try/catch
?在测试中使用expected=EXCEPTION
标记是否仍然正确?
答案 0 :(得分:5)
以下是我在单元测试中处理异常的方法:
如果你没有显式地测试异常那么你应该在方法中添加一个throws子句 - 如果抛出了异常并且你没想到它被抛出那么那就是测试失败。 如,
@Test
public void testFooNormal() throws DBException{
String key = "test";
String value = "expected";
daoClass daoMock = createMock(daoClass.class);
expect(daoMock.lookup(key)).andReturn(value);
// do an assert on returned value
...
}
如果 显式地测试异常,那么在你期望它抛出的行周围放一个try-catch(捕获你期望的Exception的最窄版本),然后设置一个布尔值在catch子句中,assert应该是boolean的值。 如,
@Test
public void testFooError(){
String key = "test";
String value = "expected";
boolean exceptionThrown = false;
daoClass daoMock = createMock(daoClass.class);
try{
expect(daoMock.lookup(key)).andReturn(value);
}catch (DBException e) {
exceptionThrown = true;
}
// assert exceptionThrown is true
...
}
这是测试异常的好方法,因为这意味着您不仅要测试抛出正确的异常,还要测试它是否与您期望的行完全一致。如果使用@test(expected = ...),那么测试中的另一行可能会抛出该异常,并且测试可能会错误地传递。
答案 1 :(得分:3)
您的DAO逻辑不应根据您的测试进行更改。如果您希望DAO抛出异常,那就保持这种方式并以您测试的方式测试Exception。
如果您正在捕获DAO本身的异常以进行回滚或日志记录等,那么测试用例不应该期望Exception,因为它不是测试用例场景。在这种情况下,您可以检查NULL,因为我希望您的DAO将返回NULL。