Writing JUnit tests for Spring Validator implementation

后端 未结 2 796
小蘑菇
小蘑菇 2020-12-08 20:09

I\'m using Spring Validator implementations to validate my object and I would like to know how do you write a unit test for a validator like this one:

public         


        
2条回答
  •  旧巷少年郎
    2020-12-08 20:48

    Here is the code that shows how to unit test for validation:

    1) The main Validator class for which one needs to write unit test:

    public class AddAccountValidator implements Validator {
    
        private static Logger LOGGER = Logger.getLogger(AddAccountValidator.class);
    
        public boolean supports(Class clazz) {
            return AddAccountForm.class.equals(clazz);
        }
    
        public void validate(Object command, Errors errors) {
            AddAccountForm form = (AddAccountForm) command;
            validateFields(form, errors);
        }
    
        protected void validateFields(AddAccountForm form, Errors errors) {
            if (!StringUtils.isBlank(form.getAccountname()) && form.getAccountname().length()>20){
                LOGGER.info("Account Name is too long");
                ValidationUtils.rejectValue(errors, "accountName", ValidationUtils.TOOLONG_VALIDATION);
            }
        }
    }
    

    2) Utility class supporting 1)

    public class ValidationUtils {
        public static final String TOOLONG_VALIDATION = "toolong";
    
        public static void rejectValue(Errors errors, String fieldName, String value) {
            if (errors.getFieldErrorCount(fieldName) == 0){
                errors.rejectValue(fieldName, value);
            }
        }
    }
    

    3) Here is the unit test:

    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.assertNull;
    
    import org.junit.Test;
    import org.springframework.validation.BeanPropertyBindingResult;
    import org.springframework.validation.Errors;
    
    import com.bos.web.forms.AddAccountForm;
    
    public class AddAccountValidatorTest {
    
        @Test
        public void validateFieldsTest_when_too_long() {
            // given
            AddAccountValidator addAccountValidator = new AddAccountValidator();
            AddAccountForm form = new AddAccountForm();
            form.setAccountName(
                    "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1");
    
            Errors errors = new BeanPropertyBindingResult(form, "");
    
            // when
            addAccountValidator.validateFields(form, errors);
    
            // then
            assertEquals(
                    "Field error in object '' on field 'accountName': rejected value [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1]; codes [toolong.accountName,toolong.java.lang.String,toolong]; arguments []; default message [null]",
                    errors.getFieldError("accountName").toString());
        }
    
        @Test
        public void validateFieldsTest_when_fine() {
            // given
            AddAccountValidator addAccountValidator = new AddAccountValidator();
            AddAccountForm form = new AddAccountForm();
            form.setAccountName("aaa1");
            Errors errors = new BeanPropertyBindingResult(form, "");
    
            // when
            addAccountValidator.validateFields(form, errors);
    
            // then
            assertNull(errors.getFieldError("accountName"));
        }
    
    }
    

提交回复
热议问题