gpt4 book ai didi

java - switch 语句的 Jacoco 覆盖率

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:37:15 29 4
gpt4 key购买 nike

我正在努力为我正在处理的库实现 100% 的代码覆盖率,但我似乎对 switch 语句和覆盖率有一些问题,我根本不明白。

我目前使用的是 Jacoco 0.7.2,因为每个新版本似乎都与 Robolectrics 背道而驰。

我测试了一个简单的 switch 语句:

public enum Type {
NONE, LEGACY, AKS
}

private static Class<?> getCipherClass(Type type) {
switch (type) {
case LEGACY:
return CipherWrapperLegacy.class;
case AKS:
return CipherWrapperAks.class;
default:
return null;
}
}

我编写的测试包含以下检查(我必须使用反射,因为该方法是私有(private)的):

final CipherWrapper instance = CipherWrapper.createInstance(mockContext, CipherWrapper.Type.LEGACY, ALIAS);
assertNotNull(instance);

Method getCipherMethod = TestUtils.makeMethodAccessible(CipherWrapper.class, "getCipherClass", CipherWrapper.Type.class);
assertNull(getCipherMethod.invoke(instance, CipherWrapper.Type.NONE));
assertEquals(CipherWrapperAks.class, getCipherMethod.invoke(instance, CipherWrapper.Type.AKS));
assertEquals(CipherWrapperLegacy.class, getCipherMethod.invoke(instance, CipherWrapper.Type.LEGACY));

结果不是我所期望的:

Jacoco code coverage result

图像有点困惑,因为黄线表明缺少某些东西。绿色图标告诉我覆盖了 3 个分支中的 3 个。

我还测试了使用 case NONE 和失败来扩展 switch case,但它没有改变任何东西。

我唯一能做的就是用 if/else 替换 switch,然后我得到 100% 的覆盖率。

目前我有 98% 的覆盖率,但根据概述,我没有遗漏任何东西: Jacoco overall coverage

最佳答案

如果 invoke 方法不喜欢你放入一个匿名变量:

getCipherMethod.invoke(instance, (CipherWrapper.Type) null);

然后尝试使用命名变量:

CipherWrapper.Type nullType = null;
getCipherMethod.invoke(instance, nullType);

此外,您应该检查调用异常是否只是包装由调用方法引起的异常,而不是调用本身的错误。

关于java - switch 语句的 Jacoco 覆盖率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35288022/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com