Eclipse 覆盖报告分支错过了,但为什么?

问题描述 投票:0回答:1

我想覆盖所有 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 覆盖率报告:

java eclipse testing code-coverage
1个回答
0
投票

错过的分支是死代码。

每个 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);
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.