我想覆盖所有 if 分支。我创建了一个带有多个 if...else 的哑类,并使用所有分支条件对其进行测试以测试覆盖率。 Eclipse 报告大约 4 个分支中有 1 个丢失,4 个分支中有 2 个丢失。但为什么会发生这种情况呢?错过的分支在哪里?
具有 if...else 条件的类:
public class Coverage {
public void function(Object o1, Object o2) {
if (o1 == null && o2 == null) {
System.out.println(o1 + " " + o2);
} else if (o1 != null && o2 == null) {
System.out.println(o1 + " " + o2);
} else if (o1 == null && o2 != null) {
System.out.println(o1 + " " + o2);
} else if (o1 != null && o2 != null) {
System.out.println(o1 + " " + o2);
}
}
}
测试:
public class CoverageTest {
Coverage c;
@BeforeEach
public void beforeEach() {
c = new Coverage();
}
@Test
public void testFunction_null_null() {
c.function(null, null);
}
@Test
public void testFunction_object_null() {
c.function(new Object(), null);
}
@Test
public void testFunction_null_object() {
c.function(null, new Object());
}
@Test
public void testFunction_object_object() {
c.function(new Object(), new Object());
}
}
Eclipse 覆盖率报告:
错过的分支是死代码。
每个 if 条件由两个布尔条件组成,产生四个分支。但仅在前两个 if 条件中,测试涵盖了布尔条件的所有组合。 最后两个 if 语句包含不必要的条件,这些条件已经在之前的 if 语句中处理过:
public void function(Object o1, Object o2) {
if (o1 == null && o2 == null) {
System.out.println(o1 + " " + o2);
} else if (o1 != null && o2 == null) {
System.out.println(o1 + " " + o2);
} else if (o1 == null) { // o2 != null (o2 == null is already caught in first if-statement)
System.out.println(o1 + " " + o2);
} else { // o1 == null and o2 != null (everything else is caught in previous if-statements)
System.out.println(o1 + " " + o2);
}
}
或者进一步简化:
public void function(Object o1, Object o2) {
if (o1 == null) {
if (o2 == null) {
System.out.println(o1 + " " + o2);
} else {
System.out.println(o1 + " " + o2);
}
} else {
if (o2 == null) {
System.out.println(o1 + " " + o2);
} else {
System.out.println(o1 + " " + o2);
}
}
}