Jacoco的问题

问题描述

我正在申请除法,它有一个验证器类。当我编写一些测试时,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);的地方创建一个附加测试,看看是否覆盖了整个方法。