让我说我测试一个依赖于另一个我们不想要或不能直接测试的方法的类方法,它以下列方式处理一个已检查的异常:
public class A {
public void process(){
if (isProcessingSuccessful()){
LOG.info("Success");
}
else {
LOG.error("Fail");
}
}
private boolean isProcessingSuccessful(){
try{
doSomeOtherStuff();
return true;
}
catch (Exception e){
return false;
}
}
}
现在,如果我有一个测试类测试A#process(),比如:
@Test
public void shouldFailDueToCommandGatewayError() {
A a = new A();
// setting up preconditions
//testing here
a.process();
//Now, assert exception was thrown during the course of a.process() execution, something like
exception.expect(NullPointerException.class);
// ?? how to do that?
}
TLTD:可以为isProcessingSuccessful()编写单独的测试或做类似的事情,但是让我们说这个方法无法进行测试,就像它在库中是私有的那样?
鉴于上述限制,有没有办法以确定如上所述的基础方法中抛出异常的方式编写测试?
答案 0 :(得分:2)
不,junit无法告诉异常被抛出,因为它被被测试的代码吃掉了。为了检测这里发生的事情,你必须检查写入日志的内容。将appender替换为保留写入内容的内容,然后测试可以验证在测试结束时写入内容的内容。
答案 1 :(得分:0)
您无法再次捕获已经消耗的异常。唯一的方法是使用如下所述的测试方法捕获异常。
使用@Test
保证应该失败的测试方法,并使用expected
参数作为预期的异常。
@Test(expected = NullPointerException.class)
public void shouldFailDueToCommandGatewayError() {
// something that throws NullPointerException
}
答案 2 :(得分:-1)
@Test(expected = NullPointerException.class)
这基本上说:
如果此测试以NullPointerException退出,则所有内容都符合预期。否则此测试将失败。
答案 3 :(得分:-1)
@Test(expected = NullPointerException.class)
已经提到了。这个功能来自wuth JUnit 4.在此之前,如果你想要检查的不只是抛出特定类型的异常,你可以这样做:
try {
doSometing("", "");
fail("exception expected");
}
catch(IllegalArgumentException iae) {
assertEquals("check message", "parameter a must not be empty", iae.getMessage());
assertNull("check non-existance of cause", iae.getCause());
}
try {
doSometing("someval", "");
fail("exception expected");
}
catch(IllegalArgumentException iae) {
assertEquals("check message", "parameter b must not be empty", iae.getMessage());
assertNull("check non-existance of cause", iae.getCause());
}
如果抛出相同类型的异常并且您希望确保使用给定的参数组合抛出“正确”异常,这将特别有用。