如何用JUnit测试Java常量类以解决Sonar零覆盖率问题
如何为Java常量类编写JUnit测试以覆盖Sonar检测
针对全是static final常量的类,要满足Sonar的覆盖率要求,只需编写测试类验证每个常量的取值即可——这样既触发类加载,又能确保常量值未被意外篡改。
测试类示例(JUnit 5)
import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; class ConstantsTest { @Test void testConstantValues() { // 验证QUERY_SEARCH_PART常量 assertEquals("db1;SELECT GF_CUSTOMER_ID,GF_EMAILUSU_DESC,GF_PHONE_ID,GF_CUSTOMER_NAME,GF_GROUP_ID FROM GJSX.T_GJSX_CUSTOMER ", Constants.QUERY_SEARCH_PART); // 验证QUERY_SEARCH_PART_CATALOG常量 assertEquals(" TABLECATALOGO WHERE OPER.G_CONTRACT_ID=TABLECATALOGO.G_CONTRACT_ID ", Constants.QUERY_SEARCH_PART_CATALOG); // 验证其余字段 assertEquals("GF_FIRST_NAME", Constants.GF_FIRST_NAME); assertEquals("G_CUSTOMER_ID", Constants.G_CUSTOMER_ID); assertEquals("G_COUNTRY_ID", Constants.G_COUNTRY_ID); assertEquals("db1;", Constants.DB1); } }
注意事项
- 原类中的
@VisibleForTestings是笔误,正确注解应为@VisibleForTesting(去掉末尾的s),否则会编译报错。 - 无需复杂逻辑,只要在测试中引用并断言每个常量的取值,Sonar就会统计该类的覆盖率。
- 这种测试额外的好处是:如果后续有人误改常量值,测试会直接失败,提前发现问题。
内容的提问来源于stack exchange,提问作者user266671
相关产品推荐
相关产品推荐

