问题描述
我正在申请除法,它有一个验证器类。当我编写一些测试时,Jacoco出现了一行,说它没有包含在测试中,但是包含在其中。 验证者代码:
public class ValidatorImpl implements Validator {
@Override
public void validate(int dividend,int divisor) {
if (divisor == 0) {
throw new IllegalArgumentException("You can`t divide by ZERO!");
}
if (divisor < 0) {
throw new IllegalArgumentException("Divisor must be above zero");
}
if (dividend < 0) {
throw new IllegalArgumentException("Dividend must be above zero");
}
}
}
及其测试类:
class ValidatorTest {
Validator validator = new ValidatorImpl();
@Test
void validatorShouldThrowIllegalArgumentExceptionIfDividendBelowZero() {
assertThrows(IllegalArgumentException.class,() -> validator.validate(-10,10),"Dividend must be above zero");
}
@Test
void validatorShouldThrowIllegalArgumentExceptionIfDivisorBelowZero() {
assertThrows(IllegalArgumentException.class,() -> validator.validate(10,-10),"Divisor must be above zero");
}
@Test
void validatorShouldThrowIllegalArgumentExceptionIfDivisorEqualsZero() {
assertThrows(IllegalArgumentException.class,0),"You can`t divide by ZERO!");
}
}
这是Jacoco的结果,它表明最后一个条件被覆盖了一半(错过了2个分支中的1个),但是我不明白为什么会发生以及什么是第二个分支。测试存在并且通过了良好的测试。即使我在IF
中交换了ValidatorImpl
,Jacoco也显示最后一个IF
被覆盖了一半。
Image
解决方法
之所以会发生这种情况,是因为存在除数和除数的值,导致没有if语句被执行。在调用validate(10,10);
的地方创建一个附加测试,看看是否覆盖了整个方法。