【发布时间】:2016-12-10 09:17:25
【问题描述】:
我在使用 SonarQube 时遇到问题,导致我的几个单元测试出现问题,提示以下问题:
向这个测试用例添加至少一个断言。
每个测试用例都类似于这种格式(其中许多断言被委托给具有通用断言的方法,以避免重复):
@Test
public void companyNameOneTooLong() throws Exception {
AddressFormBean formBean = getValidBean();
formBean.setCompanyNameOne("123456789012345678901234567890123456");
assertViolation(validator.validate(formBean), "companyNameOne", "length must be between 0 and 35");
}
private void assertViolation(Set<ConstraintViolation<AddressFormBean>> violations, String fieldname, String message) {
assertThat(violations, hasSize(1));
assertEquals(fieldname, violations.iterator().next().getPropertyPath().iterator().next().getName());
assertEquals(message, violations.iterator().next().getMessage());
}
现在,显然我可以将三个断言从私有方法中提取出来并将它们放入测试方法中——但我正在多次执行相同的检查(在不同的字段上)。
所以,我想我会尝试通过(重新)抛出 AssertionError 来模拟断言方法的行为:
private void assertViolation(Set<ConstraintViolation<AddressFormBean>> violations, String fieldname, String message) throws AssertionError {
try {
assertThat(violations, hasSize(1));
assertEquals(fieldname, violations.iterator().next().getPropertyPath().iterator().next().getName());
assertEquals(message, violations.iterator().next().getMessage());
} catch (AssertionError e) {
throw e;
}
}
不幸的是,这种方法也不起作用。
JUnit 断言方法有什么特别之处/SonarQube 专门寻找什么来检查是否为每个测试做出了断言?
或者 - 是否有其他方法可以实现相同的最终结果(避免一遍又一遍地复制共享断言代码)?
【问题讨论】:
-
也许你可以重写你的方法来返回一个
Matcher,这样你就会有assertThat(violations, hasViolation(field, message))? -
@DidierL 有趣的想法 - 不知道为什么。您想发表您的想法作为答案吗?
-
我不习惯实现匹配器,但这并不能完全回答您关于 Sonar 正在寻找什么的问题......
-
@DidierL 不用担心。无论如何,我已经更新了我的问题,以便在可能的答案中提供更大的灵活性。
标签: java unit-testing junit sonarqube