【发布时间】:2020-02-26 09:49:23
【问题描述】:
我有一个包含 3 个值的枚举 (A, B, C)。
foo 方法中使用 switch 表达式来根据枚举值做一些事情。
我还有一个带有不同值作为参数的测试用例,以确保涵盖所有条件。
但是,SonarQube 上的结果显示 “部分被测试覆盖(4 个条件中的 3 个)。”
我的问题:
- 为什么有 4 个条件?我认为应该是3个条件。
(A, B, C) - 我应该怎么做才能完全涵盖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 的情况。
- 我应该怎么做才能覆盖
default案例? - 既然我没有在 switch 语句中添加
default,为什么 SonarQube 会计入default?
【问题讨论】:
-
尝试添加一个默认情况,看看 sonarQube 是否能正确处理它。我认为有一个隐含的默认值,当你没有指定时。
-
@Mustafa 我添加了默认情况。请参阅上面的[更新]。谁添加了隐式默认情况? Java 编译器、SonarQube 还是 JaCoCo?您对隐式默认情况有任何参考吗?谢谢。
-
default(隐式或显式)是有效分支,以防其他 3 个分支丢失,因此无论您切换什么,4 个分支都是正确的(即使是enum)。这应该是多余的警告并被忽略,因为除了在测试中添加另一个值之外,您什么也做不了。例如,添加一个UNKNOWN枚举和testCondition.foo(FooType.UNKNOWN);
标签: java sonarqube code-coverage jacoco