gpt4 book ai didi

java - javax 自定义 validator 的 Junit 测试用例

转载 作者:行者123 更新时间:2023-12-02 16:34:22 24 4
gpt4 key购买 nike

我正在 Spring Boot 应用程序中使用 javax 验证 API 进行跨字段验证。我有一个用户 bean,我必须验证 firstnamelastname 都不是 null/empty。该字段至少应有一个值。

我已经为此要求创建了自定义注释 (NameMatch.java) 和自定义 validator (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("test@gmail.com");
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");
}
}
}

我必须为自定义 validator 类编写 JUnit 测试用例。我研究了 hibernate validator 文档,但找不到通过 JUnit 调用自定义 validator 方法的方法。有人可以帮忙为上述场景编写 JUnit 测试用例吗。

最佳答案

您的 NameValidator 具有公共(public)方法,因此您可以实例化一个对象并像为任何其他公共(public)方法一样编写单元测试。

使用 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() 创建模拟。

关于java - javax 自定义 validator 的 Junit 测试用例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62984669/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com