如何解决Jacoco代码覆盖率:不存在的静态块仅显示75%的覆盖率
我在BrickSortParallel类中有两个静态方法。它们被单元测试完全覆盖。但是我列出了一个静态块static {...}
,其中Jacoco仅覆盖了75%的代码。这意味着什么?
public static int computeOddTaskCount(int length) {
if (length < 0) throw new IllegalArgumentException("Illegal argument value: " + length);
return isOdd(length) ? length >> 1 : abs(length - 1) >> 1;
}
public static int computeEvenTaskCount(int length) {
if (length < 0) throw new IllegalArgumentException("Illegal argument value: " + length);
return length >> 1;
}
以下是确保上述方法的完整代码覆盖的测试用例:
class ComputeTaskCountTest {
private static final String ZERO_TASKS_EXPECTED = "Zero tasks expected.";
private static final String ONE_TASK_EXPECTED = "One task expected.";
private static final String HALF_TASKS_EXPECTED = "Half tasks expected.";
private static final String ILLEGAL_LENGTH_EXPECTED = "Illegal length expected.";
@Test
@DisplayName("BrickSortParallelTest.ComputeTaskCountTest.testZeroLength")
void testZeroLength() {
assertEquals(0,computeOddTaskCount(0),ZERO_TASKS_EXPECTED);
assertEquals(0,computeEvenTaskCount(0),ZERO_TASKS_EXPECTED);
}
@Test
@DisplayName("BrickSortParallelTest.ComputeTaskCountTest.testMinusOneLength")
void testMinusOneLength() {
assertThrows(
IllegalArgumentException.class,() -> computeOddTaskCount(-1),ILLEGAL_LENGTH_EXPECTED);
assertThrows(
IllegalArgumentException.class,() -> computeEvenTaskCount(-1),ILLEGAL_LENGTH_EXPECTED);
}
@Test
@DisplayName("BrickSortParallelTest.ComputeTaskCountTest.testMinusTwoLength")
void testMinusTwoLength() {
assertThrows(
IllegalArgumentException.class,() -> computeOddTaskCount(-2),() -> computeEvenTaskCount(-2),ILLEGAL_LENGTH_EXPECTED);
}
@Test
@DisplayName("BrickSortParallelTest.ComputeTaskCountTest.testMinValueLength")
void testMinValueLength() {
assertThrows(
IllegalArgumentException.class,() -> computeOddTaskCount(Integer.MIN_VALUE),() -> computeEvenTaskCount(Integer.MIN_VALUE),ILLEGAL_LENGTH_EXPECTED);
}
@Test
@DisplayName("BrickSortParallelTest.ComputeTaskCountTest.testOneValueLength")
void testOneValueLength() {
assertEquals(0,computeOddTaskCount(1),computeEvenTaskCount(1),ZERO_TASKS_EXPECTED);
}
@Test
@DisplayName("BrickSortParallelTest.ComputeTaskCountTest.testTwoValueLength")
void testTwoValueLength() {
assertEquals(0,computeOddTaskCount(2),ZERO_TASKS_EXPECTED);
assertEquals(1,computeEvenTaskCount(2),ONE_TASK_EXPECTED);
}
@Test
@DisplayName("BrickSortParallelTest.ComputeTaskCountTest.testThreeValueLength")
void testThreeValueLength() {
assertEquals(1,computeOddTaskCount(3),ONE_TASK_EXPECTED);
assertEquals(1,computeEvenTaskCount(3),ONE_TASK_EXPECTED);
}
@Test
@DisplayName("BrickSortParallelTest.ComputeTaskCountTest.testFourValueLength")
void testFourValueLength() {
assertEquals(1,computeOddTaskCount(4),ONE_TASK_EXPECTED);
assertEquals(2,computeEvenTaskCount(4),"Two tasks expected");
}
@Test
@DisplayName("BrickSortParallelTest.ComputeTaskCountTest.testMaxValueLength")
void testMaxValueLength() {
assertEquals(
Integer.MAX_VALUE / 2,computeOddTaskCount(Integer.MAX_VALUE),HALF_TASKS_EXPECTED);
assertEquals(
Integer.MAX_VALUE / 2,computeEvenTaskCount(Integer.MAX_VALUE),HALF_TASKS_EXPECTED);
}
@Test
@DisplayName("BrickSortParallelTest.ComputeTaskCountTest.testMaxValueLengthEven")
void testMaxValueLengthEven() {
assertEquals(
(Integer.MAX_VALUE - 2) / 2,computeOddTaskCount(Integer.MAX_VALUE - 1),HALF_TASKS_EXPECTED);
assertEquals(
(Integer.MAX_VALUE - 1) / 2,computeEvenTaskCount(Integer.MAX_VALUE - 1),HALF_TASKS_EXPECTED);
}
}
我在上述考试课程中错过了什么吗?
有关完整课程,请访问:
https://raw.githubusercontent.com/Fernal73/DSAlgos/master/src/main/java/ds/BrickSortParallel.java
$ java --version
openjdk 11.0.8 2020-07-14
OpenJDK Runtime Environment (build 11.0.8+10)
OpenJDK 64-Bit Server VM (build 11.0.8+10,mixed mode)
Jacoco版本:0.85
从报告中可以看出,静态块的圈复杂度为2,并且只覆盖了一个分支,这意味着存在test case missing to cover that eventuality。
解决方法
引用Marc R Hoffman on Jacoco Github:
“您的代码使用assert关键字,这将导致一个静态的初始值设定项:
static {};
descriptor: ()V
flags: (0x0008) ACC_STATIC
Code:
stack=1,locals=0,args_size=0
0: ldc #72 // class ds/BrickSortParallel
2: invokevirtual #73 // Method java/lang/Class.desiredAssertionStatus:()Z
5: ifne 12
8: iconst_1
9: goto 13
12: iconst_0
13: putstatic #31 // Field $assertionsDisabled:Z
16: return
LineNumberTable:
line 19: 0
StackMapTable: number_of_entries = 2
frame_type = 12 /* same */
frame_type = 64 /* same_locals_1_stack_item */
stack = [ int ]
这是一个已知的限制。解决方法是不使用断言。”
以下代码片段解决了难题:
@Generated
private void assertEquality(int size,int count) {
if (size != count)
throw new AssertionError("Size is not the same as count.");
}
它引发AssertionError,但是@Generated
注释满足了代码覆盖率的要求。但是,这是一种解决方法。解决方案是等待Jacoco在字节码中提供所需的断言过滤。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。