Jacoco 的问题

Problems with Jacoco

我正在申请分割,它有一个验证器class。当我写一些测试时,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:

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, () -> validator.validate(10, 0),
                "You can`t divide by ZERO!");
    }
}

这里是 Jacoco 的结果,它表明最后一个条件被覆盖了一半(2 个分支中的 1 个被遗漏),但我不明白为什么会发生以及什么是第二个分支。测试存在并且顺利通过。即使我在 ValidatorImpl 中交换 IF,Jacoco 也显示最后一个 IF 被一半覆盖。 Image

发生这种情况是因为除数和被除数的值导致 none 的 if 语句被执行。在调用 validate(10,10); 的地方创建一个额外的测试,看看它是否涵盖了整个方法。