【发布时间】:2019-10-29 22:42:38
【问题描述】:
过去几个月我一直在从事 Java 项目(1.8 和 11)。我们正在尝试将模型中的每个验证编码为自定义 javax 验证,我认为这是迄今为止我发现的“最佳”方法(一如既往地接受新建议)...... 但是,问题是当这个验证器需要从数据库和多个验证器中获取同一模型/实体的数据时。
实体
@DuplicatedUsername
@Getter
@Setter
public class User {
private UUID id;
private String username;
public User(username) {
this.username = username;
}
}
验证器
public class DuplicatedUsernameValidator implements ConstraintValidator<DuplicatedUsername, User> {
@Autowired
private UserRepository userRepository;
@Override
public boolean isValid(User user, ConstraintValidatorContext context) {
if (user.getId() != null) {
return checkForDuplicatedUsername(user.getUsername(), user.getId());
} else {
return checkForDuplicatedUsername(user.getUsername());
}
}
private boolean checkForDuplicatedUsername(String username) {
List<User> users = userRepository.findByUsername(username);
return users.isEmpty();
}
private boolean checkForDuplicatedUsername(String username, UUID id) {
List<User> users = userRepository.findByUsernameAndIdNot(username, id);
return users.isEmpty();
}
}
测试文件
private static Validator validator;
@BeforeClass
public static void setUpValidator() {
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
validator = factory.getValidator();
}
@MockBean
private UserRepository repository;
public void givenDuplicatedSettings_whenValidate_thenReturnInvalid() {
String username = "duplicated";
User user = new User(username);
when(repository.findByUsername(username))
.thenReturn(new User(username));
// What I have
Set<ConstraintViolation<User>> constraintViolations = validator.validate(user);
assertEquals(1, constraintViolations.size());
// What I would like to have
// validator here must be DuplicatedUsernameValidator
assertFalse(validator.isValid(user));
}
主要原因是用户可能有其他验证器,我不想将它们作为一个单元进行验证。
这是第一个问题...第二个问题与 spring 上下文有关(一如既往)...上面的代码,即使使用Set<ConstraintViolation<User>> constraintViolations = validator.validate(user); 也不起作用,因为验证器代码中的存储库为空。即使当我运行它时,它也没有被正确注入,它按预期工作。我一直在使用以下注解@RunWith(SpringRunner.class)、@DataJpaTest,以及以下代码:
@Primary
@Bean
public Validator validator(){
return new LocalValidatorFactoryBean();
}
它们都没有按预期工作。我在哪一块拼图中做错了?
提前致谢!
【问题讨论】:
标签: java spring unit-testing junit