如何使用Junit和Mockito测试Spring验证器

噩梦

我有一个Spring Validator:

@Component
public class AddClientAccountValidator implements Validator {

    @Autowired
    private ValidatorUtils validatorUtils;

    @Override
    public boolean supports(Class<?> clazz) {
        return UserDto.class.equals(clazz);
    }

    @Override
    public void validate(Object target, Errors errors) {
        UserDto user = (UserDto) target;
        validatorUtils.setParam(errors, user);

        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "username", "username.required");
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "password", "password.required");
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "confirmPassword",
                "confirmPassword.required");
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "firstName", "firstName.required");
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "lastName", "lastName.required");
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "personalId", "personalId.required");
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "city", "city.required");
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "address", "address.required");
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "email", "email.required");
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "phone", "phone.required");
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "contribution", "contribution.required");

        validatorUtils.validateAddClientAccount();
    }
}

在上面的Validator中注入了ValidatorUtils类:

@Component
class ValidatorUtils {

    @Autowired
    private PersonalIdValidator personalIdValidator;
    private Errors errors;
    private UserDto user;

    void setParam(Errors errors, UserDto user) {
        this.errors = errors;
        this.user = user;
    }

    void validateAddClientAccount() {
        validateAccount();
        validContributionAccount();
    }

    private void validateAccount() {
        validUsername();
        validPassword();
        validFirstName();
        validLastName();
        validPersonalId();
        validCity();
        validAddress();
        validEmail();
        validPhone();
    }
    public void validateChangePassword() {
        validChangePassword();
    }

    private void validUsername() {
        if (!user.getUsername().isEmpty()) {
            String username = user.getUsername();
            if ((username.length() < 3) || (username.length() > 40)) {
                errors.rejectValue("username", "username.format");
            }
        }
    }

    private void validPassword() {
        if (!user.getPassword().isEmpty()) {
            String password = user.getPassword();
            if ((password.length() < 3) || (password.length() > 40)) {
                errors.rejectValue("password", "password.format");
            }
            if (!password.equals(user.getConfirmPassword())) {
                errors.rejectValue("confirmPassword", "password.confirm");
            }
        }
    }

    private void validFirstName() {
        if (!user.getFirstName().isEmpty()) {
            String firstName = user.getFirstName();
            String regex = "[A-ZŁ{1}]+[a-zł]+";
            boolean validFirstName = Pattern.matches(regex, firstName);
            if ((firstName.length() < 3) || (firstName.length() > 40) || !validFirstName) {
                errors.rejectValue("firstName", "firstName.format");
            }
        }
    }

    private void validLastName() {
        if (!user.getLastName().isEmpty()) {
            String lastName = user.getLastName();
            String regex = "[A-ZĆŁŚŻŹ{1}]+[a-ząćęłńóśżź]+";
            String regexWithTwoLastName = "[A-ZĆŁŚŻŹ{1}]+[a-ząćęłńóśżź]++[\\s]+[A-ZĆŁŚŻŹ{1}]+[a-ząćęłńóśżź]+";
            boolean validLastName = Pattern.matches(regex, lastName);
            boolean validWithTwoLastName = Pattern.matches(regexWithTwoLastName, lastName);
            if ((lastName.length() < 3) || (lastName.length() > 40)
                    || (!validLastName && !validWithTwoLastName)) {
                errors.rejectValue("lastName", "lastName.format");
            }
        }
    }

此类有更多用于字段的验证器,但我跳过了。

我想使用Junit或最终使用Mockito测试我的Validator类。我写这个测试类:

    @RunWith(MockitoJUnitRunner.class)
public class AddClientAccValidatorTest {

    @InjectMocks
    private AddClientAccountValidator validator;
    @Mock
    private ValidatorUtils validatoUtils;
    private UserDto userDto;
    public Errors errors;

    @Before
    public void setUp() {
        UserDto userDto = new UserDto();
        errors = new BeanPropertyBindingResult(userDto, "userDto");
    }

    @Test
    public void testValidate() {
        validator.validate(userDto, errors);
        assertFalse(errors.hasErrors());
    }

}

但是当我运行测试时,我得到了Failet跟踪:

java.lang.AssertionError
at org.junit.Assert.fail(Assert.java:86)
at org.junit.Assert.assertTrue(Assert.java:41)
at org.junit.Assert.assertFalse(Assert.java:64)
at org.junit.Assert.assertFalse(Assert.java:74)
at pl.piotr.ibank.validator.AddClientAccValidatorTest.testValidate(AddClientAccValidatorTest.java:67)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.mockito.internal.runners.JUnit45AndHigherRunnerImpl.run(JUnit45AndHigherRunnerImpl.java:37)
at org.mockito.runners.MockitoJUnitRunner.run(MockitoJUnitRunner.java:62)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

为什么会出现此错误?我在这一行出现错误:

errors = new BeanPropertyBindingResult(userDto, "userDto");

我的第二个问题是我无法声明多个RunWith批注。当我添加时:

@RunWith(MockitoJUnitRunner.class)

我无法使用来参数化我的测试 @RunWith(Parameterized.class)

怎么解决呢?

有人可以帮助我吗?也许我的方法不好?用Junit测试Spring Validator的最佳方法是什么?

安德烈·布拉兹奇克(AndréBlaszczyk)

您可以在没有Mockito的情况下成功运行测试。以下代码适用于Spring @Configuration类(需要依赖项进行spring-test):

package foo.bar;

import static org.junit.Assert.assertFalse;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.AnnotationConfigContextLoader;
import org.springframework.validation.BeanPropertyBindingResult;
import org.springframework.validation.Errors;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader = AnnotationConfigContextLoader.class)
public class AddClientAccValidatorTest {

    @Configuration
    static class ContextConfiguration {

        @Bean
        public AddClientAccountValidator validator() {
            return new AddClientAccountValidator();
        }

        @Bean
        public ValidatorUtils validatorUtils() {
            return new ValidatorUtils();
        }
    }

    @Autowired
    private AddClientAccountValidator validator;
    private UserDto userDto;
    public Errors errors;

    @Before
    public void setUp() {
        userDto = new UserDto();
        userDto.setLastName("Doe");
        userDto.setFirstName("John");
        userDto.setUsername("username");
        userDto.setPhone("phone");
        userDto.setPassword("password");
        userDto.setConfirmedPassword("password");
        userDto.setEmail("email");
        userDto.setContribution("contribution");
        userDto.setAddress("address");
        userDto.setCity("city");
        userDto.setPersonalId("personalId");
        errors = new BeanPropertyBindingResult(userDto, "userDto");
    }

    @Test
    public void testValidate() {
        validator.validate(userDto, errors);
        assertFalse(errors.hasErrors());
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何验证使用Spring,JUnit和Mockito发布了事件?

如何使用junit和mockito测试springjdbcTemplate

如何使用Junit和Mockito使用Spring存储库测试void方法

如何测试休息控制器,静态util的使用JUnit和调用的Mockito

如何使用Java JUnit和Mockito验证传递给静态函数的参数(Spring Boot)

如何使用Mockito和JUnit在Spring Boot中测试DELETE方法

如何使用JUnit和Mockito测试自定义JsonSerializer

如何使用Junit和Mockito测试DaoImpl方法

如何使用Junit和Mockito测试Sum Double值?

如何使用JUnit和Mockito测试我的JwtAuthentication类?

如何使用JUnit和/或Mockito测试void方法

如何使用 mockito 和 junit 测试此功能?

如何使用 spring boot 和 mockito 对控制器方法进行单元测试

使用Mockito和Junit时如何自动装配Spring bean?

如何使用Mockito在Spring Boot中测试资源加载器

如何在JUnit测试中使用Mockito?

如何使用JUnit或Mockito测试匿名方法?

如何使用Mockito在Junit测试用例中验证logger.error(String message,Throwable t)

使用 Junit 和 Mockito 的 Rest API 的 Junit 测试用例

在Spring的JUnit测试中如何使用MyBatis映射器?

在 Spring Boot 中使用 JUnit5 和 Mockito 进行集成测试

如何使用junit,spring和JPA测试Optmistic Locking?

Mockito,JUnit和Spring

如何使用JUnit或Mockito测试使用无参数和返回值的Random()方法

如何使用 Mockito 和 Junit 模拟 ZonedDateTime

我应该如何用JUNIT和Mockito测试此方法

使用Junit和Mockito测试catch块逻辑

使用和的Mockito到的JUnit测试图像

使用Junit和Mockito嵌套异常问题测试POST Api