Javax Custom Validator的Junit测试用例

user3244519:

我正在使用Spring Boot Application中的javax验证API进行跨字段验证。我有一个用户bean,我必须验证两者firstnamelastname并且不为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测试用例吗?

rieckpil:

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章