【问题标题】:Miscounting switch conditions with enum in SonarQube在 SonarQube 中使用枚举错误计算开关条件
【发布时间】:2020-02-26 09:49:23
【问题描述】:

我有一个包含 3 个值的枚举 (A, B, C)

foo 方法中使用 switch 表达式来根据枚举值做一些事情。

我还有一个带有不同值作为参数的测试用例,以确保涵盖所有条件。

但是,SonarQube 上的结果显示 “部分被测试覆盖(4 个条件中的 3 个)。”

我的问题:

  1. 为什么有 4 个条件?我认为应该是3个条件。(A, B, C)
  2. 我应该怎么做才能完全涵盖4个条件?
public enum FooType
{
    A, B, C
}

public class TestCondition
{
    public int foo (FooType type)
    {
        int ans = 0;

        switch (type) {
            case A:
                ans = 10;
                break;
            case B:
                ans = 20;
                break;
            case C:
                ans = 30;
                break;
        }

        return ans;
    }
}

@Test
public void testFoo ()
{
    TestCondition testCondition = new TestCondition();

    testCondition.foo(FooType.A);
    testCondition.foo(FooType.B);
    testCondition.foo(FooType.C);
}

[更新]

尝试添加默认大小写,结果是一样的。

似乎第四个条件是default 的情况。

  1. 我应该怎么做才能覆盖default 案例?
  2. 既然我没有在 switch 语句中添加 default,为什么 SonarQube 会计入 default

【问题讨论】:

  • 尝试添加一个默认情况,看看 sonarQube 是否能正确处理它。我认为有一个隐含的默认值,当你没有指定时。
  • @Mustafa 我添加了默认情况。请参阅上面的[更新]。谁添加了隐式默认情况? Java 编译器、SonarQube 还是 JaCoCo?您对隐式默认情况有任何参考吗?谢谢。
  • default(隐式或显式)是有效分支,以防其他 3 个分支丢失,因此无论您切换什么,4 个分支都是正确的(即使是 enum)。这应该是多余的警告并被忽略,因为除了在测试中添加另一个值之外,您什么也做不了。例如,添加一个UNKNOWN 枚举和testCondition.foo(FooType.UNKNOWN);

标签: java sonarqube code-coverage jacoco


【解决方案1】:

为什么有 4 个条件?我认为应该是3个条件。(A,B,C)

不,有 4 个分支:A、B、C 和另一个不是 A、B、C 的值。是的,我不在乎你的枚举只有 3 个常量,我关心的是你的 switch 语句有 4 个有效分支,无论你是否定义 default

我应该怎么做才能完全涵盖4个条件?

忽略警告,它应该是多余的。如果您想要完全覆盖,则必须在测试中再添加 1 个案例。由于您正在切换枚举,因此您也必须向枚举添加另一个常量。喜欢:DEFAULTUNKNOWN

【讨论】:

  • 添加另一个常量(例如,DEFAULTUNKNOWN)可能很麻烦。该常量将是多余的,因为它的唯一目的是通过条件覆盖。您有更好的方法来实现这一目标吗?谢谢。
  • @cwliang 很遗憾,没有。如果您查看字节码,您的交换机总是有 4 个分支。如果您不传递有效值,则无法完全覆盖所有分支。或者你只需​​要忽略它。
猜你喜欢
  • 2019-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-02
  • 1970-01-01
相关资源
最近更新 更多