我想编写单元测试,验证bean验证约束的正确配置。我认为应该对数据集进行测试,以验证许多不同的组合。JUnit - 使用数据集测试bean验证的最佳实践
到目前为止,我做了这个代码:
@RunWith(Parameterized.class)
public class TagTest {
private Validator validator;
@Parameterized.Parameter
public Pair<Boolean, Tag> tagPair;
@Parameterized.Parameters
public static Collection<Pair<Boolean, Tag>> testData() {
Collection<Pair<Boolean, Tag>> tags = new ArrayList<>();
Tag tag = new Tag();
tag.setId(1L);
tag.setVersion(1L);
tag.setTitle("Sample");
tags.add(new ImmutablePair<>(true, tag));
// ... more sample data
return tags;
}
@Before
public void init() {
ValidatorFactory vf = Validation.buildDefaultValidatorFactory();
this.validator = vf.getValidator();
}
@Test
public void shouldBeValidated() {
Set<ConstraintViolation<Tag>> violations = validator.validate(
tagPair.getRight());
Assert.assertTrue(violations.isEmpty() == tagPair.getLeft());
}
}
什么将读取样本数据最好的解决办法?在代码中保存数据对我来说不是很好。我的例子中的标签是扁平物体。如果对象会变得复杂呢?
单元测试是否可以接受,我会进行bean验证的一般测试,它会接受Object
(而不是我的情况下的Tag
),然后验证我要推入的任何数据?
通过为包含所有成员的'Tag'提供一个构造函数,可以缩短很多事情,因此不需要调用setter方法。你也可以考虑使用JUnitParams作为你的跑步者,因为它比内置的参数化跑步者有更好的功能。 – ngreen
为Tag提供构造函数不是一般的解决方案。那些有很多属性的实体呢? JUnitParams似乎很有前途。 – srnjak
如果您的模型非常复杂以至于无法使用构造函数,那么您的模型可能错了,或者您的测试可能不够狭窄。否则,您将需要一种方法来序列化所有测试输入,并构建可用于连接参数化测试套件的自定义解串器。 – ngreen