Eclipse覆盖率报告了分支遗漏,但为什么呢?

bkkx9g8r  于 2023-10-18  发布在  Eclipse
关注(0)|答案(1)|浏览(160)

我要覆盖所有的分支机构。我创建了一个带有多个if... else的哑类,并使用所有分支条件测试它以测试覆盖率。Eclipse报告了1/4个分支缺失和2/4个分支缺失。但为什么会这样呢?失踪的树枝在哪里?
带有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覆盖率报告:

nxowjjhe

nxowjjhe1#

遗漏的分支是死代码。
每个 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);
        }
    }
}

相关问题