我正在使用Spring Boot Application中的javax验证API进行跨字段验证。我有一个用户bean,我必须验证两者firstname
,lastname
并且不为null / empty。此字段至少应有一个值。
为此,我创建了自定义注释(NameMatch.java
)和自定义验证器(NameValidator.java
)。
@NameMatch(first = "firstname", second = "lastname", message = "The first and lastname can't be null")
public class User {
private String firstname;
private String lastname;
@NotNull
@Email
private String email;
@NotNull
private String phone;
}
NameMatch.java
@Target({TYPE, ANNOTATION_TYPE})
@Retention(RUNTIME)
@Constraint(validatedBy = NameValidator.class)
@Documented
public @interface NameMatch
{
String message() default "{constraints.fieldmatch}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
/**
* @return The first field
*/
String first();
/**
* @return The second field
*/
String second();
}
NameValidator.java
public class NameValidator implements ConstraintValidator<NameMatch, Object>
{
private String firstFieldName;
private String secondFieldName;
@Override
public void initialize(final NameMatch constraintAnnotation)
{
firstFieldName = constraintAnnotation.first();
secondFieldName = constraintAnnotation.second();
}
@Override
public boolean isValid(final Object value, final ConstraintValidatorContext context)
{
boolean isValidName = false;
try
{
final Object firstName = BeanUtils.getProperty(value, firstFieldName);
final Object lastName = BeanUtils.getProperty(value, secondFieldName);
// Validation logic
}
catch (final Exception ignore)
{
}
return isValidName;
}
}
UserValidator.java
public class UserValidator
{
public void isValidUser()
{
//Create ValidatorFactory which returns validator
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
//It validates bean instances
Validator validator = factory.getValidator();
User user = new User();
user.setEmail("[email protected]");
user.setPhone("12345678")
//Validate bean
Set<ConstraintViolation<User>> constraintViolations = validator.validate(user);
//Show errors
if (constraintViolations.size() > 0) {
for (ConstraintViolation<User> violation : constraintViolations) {
System.out.println(violation.getMessage());
}
} else {
System.out.println("Valid Object");
}
}
}
我必须为Custom Validator类编写JUnit测试用例。我浏览了休眠验证器文档,但找不到通过JUnit调用自定义验证器方法的方法。有人可以帮忙为上述情况编写JUnit测试用例吗?
您NameValidator
拥有公共方法,因此您可以实例化对象并像其他任何公共方法一样编写单元测试。
使用Mockito进行的JUnit 5测试可能如下所示:
@ExtendWith(MockitoExtension.class)
class NameValidatorTest {
@Mock
private NameMatch nameMatch;
@Mock
private ConstraintValidatorContext constraintValidatorContext;
@Test
public void testIsValid() {
when(nameMatch.first()).thenReturn("firstname");
when(nameMatch.second()).thenReturn("lastname");
NameValidator nameValidator = new NameValidator();
nameValidator.initialize(nameMatch);
User user = new User();
user.setFirstname("Duke");
user.setLastname("Duke");
boolean result = nameValidator.isValid(user, constraintValidatorContext);
assertTrue(result);
}
}
根据您的需要,ConstraintValidatorContext
您可能还希望模拟方法或稍后验证是否调用了特定方法。
如果您不使用JUnit 5,则可以将代码调整为不使用JUnit 5,MockitoExtension
并使用来创建模拟Mockito.mock()
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句