Introduce Validator.validateObject(Object) with returned Errors
Includes failOnError method on Errors interface for use with validateObject. Declares many Errors methods as default methods for lean SimpleErrors class. Closes gh-19877
This commit is contained in:
@@ -79,6 +79,7 @@ import static org.assertj.core.api.Assertions.entry;
|
||||
* @author Rob Harrop
|
||||
* @author Kazuki Shimizu
|
||||
* @author Sam Brannen
|
||||
* @author Arjen Poutsma
|
||||
*/
|
||||
class DataBinderTests {
|
||||
|
||||
@@ -92,6 +93,7 @@ class DataBinderTests {
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@Test
|
||||
void bindingNoErrors() throws BindException {
|
||||
TestBean rod = new TestBean();
|
||||
@@ -113,7 +115,7 @@ class DataBinderTests {
|
||||
TestBean tb = (TestBean) map.get("person");
|
||||
assertThat(tb.equals(rod)).as("Same object").isTrue();
|
||||
|
||||
BindingResult other = new BeanPropertyBindingResult(rod, "person");
|
||||
BindingResult other = new DataBinder(rod, "person").getBindingResult();
|
||||
assertThat(binder.getBindingResult()).isEqualTo(other);
|
||||
assertThat(other).isEqualTo(binder.getBindingResult());
|
||||
BindException ex = new BindException(other);
|
||||
@@ -167,8 +169,9 @@ class DataBinderTests {
|
||||
pvs.add("name", "Rod");
|
||||
pvs.add("age", 32);
|
||||
pvs.add("nonExisting", "someValue");
|
||||
assertThatExceptionOfType(NotWritablePropertyException.class).isThrownBy(() ->
|
||||
binder.bind(pvs));
|
||||
|
||||
assertThatExceptionOfType(NotWritablePropertyException.class)
|
||||
.isThrownBy(() -> binder.bind(pvs));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -178,8 +181,9 @@ class DataBinderTests {
|
||||
MutablePropertyValues pvs = new MutablePropertyValues();
|
||||
pvs.add("name", "Rod");
|
||||
pvs.add("spouse.age", 32);
|
||||
assertThatExceptionOfType(NullValueInNestedPathException.class).isThrownBy(() ->
|
||||
binder.bind(pvs));
|
||||
|
||||
assertThatExceptionOfType(NullValueInNestedPathException.class)
|
||||
.isThrownBy(() -> binder.bind(pvs));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -207,57 +211,56 @@ class DataBinderTests {
|
||||
pvs.add("age", "32x");
|
||||
pvs.add("touchy", "m.y");
|
||||
binder.bind(pvs);
|
||||
assertThatExceptionOfType(BindException.class).isThrownBy(
|
||||
binder::close)
|
||||
.satisfies(ex -> {
|
||||
assertThat(rod.getName()).isEqualTo("Rod");
|
||||
Map<?, ?> map = binder.getBindingResult().getModel();
|
||||
TestBean tb = (TestBean) map.get("person");
|
||||
assertThat(tb).isSameAs(rod);
|
||||
|
||||
BindingResult br = (BindingResult) map.get(BindingResult.MODEL_KEY_PREFIX + "person");
|
||||
assertThat(BindingResultUtils.getBindingResult(map, "person")).isEqualTo(br);
|
||||
assertThat(BindingResultUtils.getRequiredBindingResult(map, "person")).isEqualTo(br);
|
||||
assertThatExceptionOfType(BindException.class).isThrownBy(binder::close).satisfies(ex -> {
|
||||
assertThat(rod.getName()).isEqualTo("Rod");
|
||||
Map<?, ?> map = binder.getBindingResult().getModel();
|
||||
TestBean tb = (TestBean) map.get("person");
|
||||
assertThat(tb).isSameAs(rod);
|
||||
|
||||
assertThat(BindingResultUtils.getBindingResult(map, "someOtherName")).isNull();
|
||||
assertThatIllegalStateException().isThrownBy(() ->
|
||||
BindingResultUtils.getRequiredBindingResult(map, "someOtherName"));
|
||||
BindingResult br = (BindingResult) map.get(BindingResult.MODEL_KEY_PREFIX + "person");
|
||||
assertThat(BindingResultUtils.getBindingResult(map, "person")).isEqualTo(br);
|
||||
assertThat(BindingResultUtils.getRequiredBindingResult(map, "person")).isEqualTo(br);
|
||||
|
||||
assertThat(binder.getBindingResult()).as("Added itself to map").isSameAs(br);
|
||||
assertThat(br.hasErrors()).isTrue();
|
||||
assertThat(br.getErrorCount()).isEqualTo(2);
|
||||
assertThat(BindingResultUtils.getBindingResult(map, "someOtherName")).isNull();
|
||||
assertThatIllegalStateException().isThrownBy(() ->
|
||||
BindingResultUtils.getRequiredBindingResult(map, "someOtherName"));
|
||||
|
||||
assertThat(br.hasFieldErrors("age")).isTrue();
|
||||
assertThat(br.getFieldErrorCount("age")).isEqualTo(1);
|
||||
assertThat(binder.getBindingResult().getFieldValue("age")).isEqualTo("32x");
|
||||
FieldError ageError = binder.getBindingResult().getFieldError("age");
|
||||
assertThat(ageError).isNotNull();
|
||||
assertThat(ageError.getCode()).isEqualTo("typeMismatch");
|
||||
assertThat(ageError.getRejectedValue()).isEqualTo("32x");
|
||||
assertThat(ageError.contains(TypeMismatchException.class)).isTrue();
|
||||
assertThat(ageError.contains(NumberFormatException.class)).isTrue();
|
||||
assertThat(ageError.unwrap(NumberFormatException.class).getMessage()).contains("32x");
|
||||
assertThat(tb.getAge()).isEqualTo(0);
|
||||
assertThat(binder.getBindingResult()).as("Added itself to map").isSameAs(br);
|
||||
assertThat(br.hasErrors()).isTrue();
|
||||
assertThat(br.getErrorCount()).isEqualTo(2);
|
||||
|
||||
assertThat(br.hasFieldErrors("touchy")).isTrue();
|
||||
assertThat(br.getFieldErrorCount("touchy")).isEqualTo(1);
|
||||
assertThat(binder.getBindingResult().getFieldValue("touchy")).isEqualTo("m.y");
|
||||
FieldError touchyError = binder.getBindingResult().getFieldError("touchy");
|
||||
assertThat(touchyError).isNotNull();
|
||||
assertThat(touchyError.getCode()).isEqualTo("methodInvocation");
|
||||
assertThat(touchyError.getRejectedValue()).isEqualTo("m.y");
|
||||
assertThat(touchyError.contains(MethodInvocationException.class)).isTrue();
|
||||
assertThat(touchyError.unwrap(MethodInvocationException.class).getCause().getMessage()).contains("a .");
|
||||
assertThat(tb.getTouchy()).isNull();
|
||||
assertThat(br.hasFieldErrors("age")).isTrue();
|
||||
assertThat(br.getFieldErrorCount("age")).isEqualTo(1);
|
||||
assertThat(binder.getBindingResult().getFieldValue("age")).isEqualTo("32x");
|
||||
FieldError ageError = binder.getBindingResult().getFieldError("age");
|
||||
assertThat(ageError).isNotNull();
|
||||
assertThat(ageError.getCode()).isEqualTo("typeMismatch");
|
||||
assertThat(ageError.getRejectedValue()).isEqualTo("32x");
|
||||
assertThat(ageError.contains(TypeMismatchException.class)).isTrue();
|
||||
assertThat(ageError.contains(NumberFormatException.class)).isTrue();
|
||||
assertThat(ageError.unwrap(NumberFormatException.class).getMessage()).contains("32x");
|
||||
assertThat(tb.getAge()).isEqualTo(0);
|
||||
|
||||
DataBinder binder2 = new DataBinder(new TestBean(), "person");
|
||||
MutablePropertyValues pvs2 = new MutablePropertyValues();
|
||||
pvs2.add("name", "Rod");
|
||||
pvs2.add("age", "32x");
|
||||
pvs2.add("touchy", "m.y");
|
||||
binder2.bind(pvs2);
|
||||
assertThat(ex.getBindingResult()).isEqualTo(binder2.getBindingResult());
|
||||
});
|
||||
assertThat(br.hasFieldErrors("touchy")).isTrue();
|
||||
assertThat(br.getFieldErrorCount("touchy")).isEqualTo(1);
|
||||
assertThat(binder.getBindingResult().getFieldValue("touchy")).isEqualTo("m.y");
|
||||
FieldError touchyError = binder.getBindingResult().getFieldError("touchy");
|
||||
assertThat(touchyError).isNotNull();
|
||||
assertThat(touchyError.getCode()).isEqualTo("methodInvocation");
|
||||
assertThat(touchyError.getRejectedValue()).isEqualTo("m.y");
|
||||
assertThat(touchyError.contains(MethodInvocationException.class)).isTrue();
|
||||
assertThat(touchyError.unwrap(MethodInvocationException.class).getCause().getMessage()).contains("a .");
|
||||
assertThat(tb.getTouchy()).isNull();
|
||||
|
||||
DataBinder binder2 = new DataBinder(new TestBean(), "person");
|
||||
MutablePropertyValues pvs2 = new MutablePropertyValues();
|
||||
pvs2.add("name", "Rod");
|
||||
pvs2.add("age", "32x");
|
||||
pvs2.add("touchy", "m.y");
|
||||
binder2.bind(pvs2);
|
||||
assertThat(ex.getBindingResult()).isEqualTo(binder2.getBindingResult());
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -267,15 +270,17 @@ class DataBinderTests {
|
||||
MutablePropertyValues pvs = new MutablePropertyValues();
|
||||
pvs.add("class.classLoader.URLs[0]", "https://myserver");
|
||||
binder.setIgnoreUnknownFields(false);
|
||||
assertThatExceptionOfType(NotWritablePropertyException.class).isThrownBy(() ->
|
||||
binder.bind(pvs))
|
||||
.withMessageContaining("classLoader");
|
||||
|
||||
assertThatExceptionOfType(NotWritablePropertyException.class)
|
||||
.isThrownBy(() -> binder.bind(pvs))
|
||||
.withMessageContaining("classLoader");
|
||||
}
|
||||
|
||||
@Test
|
||||
void bindingWithErrorsAndCustomEditors() {
|
||||
TestBean rod = new TestBean();
|
||||
DataBinder binder = new DataBinder(rod, "person");
|
||||
|
||||
binder.registerCustomEditor(String.class, "touchy", new PropertyEditorSupport() {
|
||||
@Override
|
||||
public void setAsText(String text) throws IllegalArgumentException {
|
||||
@@ -296,6 +301,7 @@ class DataBinderTests {
|
||||
return ((TestBean) getValue()).getName();
|
||||
}
|
||||
});
|
||||
|
||||
MutablePropertyValues pvs = new MutablePropertyValues();
|
||||
pvs.add("name", "Rod");
|
||||
pvs.add("age", "32x");
|
||||
@@ -303,41 +309,39 @@ class DataBinderTests {
|
||||
pvs.add("spouse", "Kerry");
|
||||
binder.bind(pvs);
|
||||
|
||||
assertThatExceptionOfType(BindException.class).isThrownBy(
|
||||
binder::close)
|
||||
.satisfies(ex -> {
|
||||
assertThat(rod.getName()).isEqualTo("Rod");
|
||||
Map<?, ?> model = binder.getBindingResult().getModel();
|
||||
TestBean tb = (TestBean) model.get("person");
|
||||
assertThat(tb).isEqualTo(rod);
|
||||
assertThatExceptionOfType(BindException.class).isThrownBy(binder::close).satisfies(ex -> {
|
||||
assertThat(rod.getName()).isEqualTo("Rod");
|
||||
Map<?, ?> model = binder.getBindingResult().getModel();
|
||||
TestBean tb = (TestBean) model.get("person");
|
||||
assertThat(tb).isEqualTo(rod);
|
||||
|
||||
BindingResult br = (BindingResult) model.get(BindingResult.MODEL_KEY_PREFIX + "person");
|
||||
assertThat(binder.getBindingResult()).isSameAs(br);
|
||||
assertThat(br.hasErrors()).isTrue();
|
||||
assertThat(br.getErrorCount()).isEqualTo(2);
|
||||
BindingResult br = (BindingResult) model.get(BindingResult.MODEL_KEY_PREFIX + "person");
|
||||
assertThat(binder.getBindingResult()).isSameAs(br);
|
||||
assertThat(br.hasErrors()).isTrue();
|
||||
assertThat(br.getErrorCount()).isEqualTo(2);
|
||||
|
||||
assertThat(br.hasFieldErrors("age")).isTrue();
|
||||
assertThat(br.getFieldErrorCount("age")).isEqualTo(1);
|
||||
assertThat(binder.getBindingResult().getFieldValue("age")).isEqualTo("32x");
|
||||
FieldError ageError = binder.getBindingResult().getFieldError("age");
|
||||
assertThat(ageError).isNotNull();
|
||||
assertThat(ageError.getCode()).isEqualTo("typeMismatch");
|
||||
assertThat(ageError.getRejectedValue()).isEqualTo("32x");
|
||||
assertThat(tb.getAge()).isEqualTo(0);
|
||||
assertThat(br.hasFieldErrors("age")).isTrue();
|
||||
assertThat(br.getFieldErrorCount("age")).isEqualTo(1);
|
||||
assertThat(binder.getBindingResult().getFieldValue("age")).isEqualTo("32x");
|
||||
FieldError ageError = binder.getBindingResult().getFieldError("age");
|
||||
assertThat(ageError).isNotNull();
|
||||
assertThat(ageError.getCode()).isEqualTo("typeMismatch");
|
||||
assertThat(ageError.getRejectedValue()).isEqualTo("32x");
|
||||
assertThat(tb.getAge()).isEqualTo(0);
|
||||
|
||||
assertThat(br.hasFieldErrors("touchy")).isTrue();
|
||||
assertThat(br.getFieldErrorCount("touchy")).isEqualTo(1);
|
||||
assertThat(binder.getBindingResult().getFieldValue("touchy")).isEqualTo("m.y");
|
||||
FieldError touchyError = binder.getBindingResult().getFieldError("touchy");
|
||||
assertThat(touchyError).isNotNull();
|
||||
assertThat(touchyError.getCode()).isEqualTo("methodInvocation");
|
||||
assertThat(touchyError.getRejectedValue()).isEqualTo("m.y");
|
||||
assertThat(tb.getTouchy()).isNull();
|
||||
assertThat(br.hasFieldErrors("touchy")).isTrue();
|
||||
assertThat(br.getFieldErrorCount("touchy")).isEqualTo(1);
|
||||
assertThat(binder.getBindingResult().getFieldValue("touchy")).isEqualTo("m.y");
|
||||
FieldError touchyError = binder.getBindingResult().getFieldError("touchy");
|
||||
assertThat(touchyError).isNotNull();
|
||||
assertThat(touchyError.getCode()).isEqualTo("methodInvocation");
|
||||
assertThat(touchyError.getRejectedValue()).isEqualTo("m.y");
|
||||
assertThat(tb.getTouchy()).isNull();
|
||||
|
||||
assertThat(br.hasFieldErrors("spouse")).isFalse();
|
||||
assertThat(binder.getBindingResult().getFieldValue("spouse")).isEqualTo("Kerry");
|
||||
assertThat(tb.getSpouse()).isNotNull();
|
||||
});
|
||||
assertThat(br.hasFieldErrors("spouse")).isFalse();
|
||||
assertThat(binder.getBindingResult().getFieldValue("spouse")).isEqualTo("Kerry");
|
||||
assertThat(tb.getSpouse()).isNotNull();
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -1144,12 +1148,11 @@ class DataBinderTests {
|
||||
tb2.setAge(34);
|
||||
tb.setSpouse(tb2);
|
||||
DataBinder db = new DataBinder(tb, "tb");
|
||||
db.setValidator(new TestBeanValidator());
|
||||
MutablePropertyValues pvs = new MutablePropertyValues();
|
||||
pvs.add("spouse.age", "argh");
|
||||
db.bind(pvs);
|
||||
Errors errors = db.getBindingResult();
|
||||
Validator testValidator = new TestBeanValidator();
|
||||
testValidator.validate(tb, errors);
|
||||
|
||||
errors.setNestedPath("spouse");
|
||||
assertThat(errors.getNestedPath()).isEqualTo("spouse.");
|
||||
@@ -1196,8 +1199,7 @@ class DataBinderTests {
|
||||
void validatorWithErrors() {
|
||||
TestBean tb = new TestBean();
|
||||
tb.setSpouse(new TestBean());
|
||||
|
||||
Errors errors = new BeanPropertyBindingResult(tb, "tb");
|
||||
Errors errors = new DataBinder(tb, "tb").getBindingResult();
|
||||
|
||||
Validator testValidator = new TestBeanValidator();
|
||||
testValidator.validate(tb, errors);
|
||||
@@ -1209,7 +1211,11 @@ class DataBinderTests {
|
||||
errors.setNestedPath("");
|
||||
assertThat(errors.hasErrors()).isTrue();
|
||||
assertThat(errors.getErrorCount()).isEqualTo(6);
|
||||
assertThat(errors.getAllErrors())
|
||||
.containsAll(errors.getGlobalErrors())
|
||||
.containsAll(errors.getFieldErrors());
|
||||
|
||||
assertThat(errors.hasGlobalErrors()).isTrue();
|
||||
assertThat(errors.getGlobalErrorCount()).isEqualTo(2);
|
||||
assertThat(errors.getGlobalError().getCode()).isEqualTo("NAME_TOUCHY_MISMATCH");
|
||||
assertThat((errors.getGlobalErrors().get(0)).getCode()).isEqualTo("NAME_TOUCHY_MISMATCH");
|
||||
@@ -1265,10 +1271,11 @@ class DataBinderTests {
|
||||
TestBean tb = new TestBean();
|
||||
tb.setSpouse(new TestBean());
|
||||
|
||||
BeanPropertyBindingResult errors = new BeanPropertyBindingResult(tb, "tb");
|
||||
DataBinder dataBinder = new DataBinder(tb, "tb");
|
||||
DefaultMessageCodesResolver codesResolver = new DefaultMessageCodesResolver();
|
||||
codesResolver.setPrefix("validation.");
|
||||
errors.setMessageCodesResolver(codesResolver);
|
||||
dataBinder.setMessageCodesResolver(codesResolver);
|
||||
Errors errors = dataBinder.getBindingResult();
|
||||
|
||||
Validator testValidator = new TestBeanValidator();
|
||||
testValidator.validate(tb, errors);
|
||||
@@ -1280,7 +1287,11 @@ class DataBinderTests {
|
||||
errors.setNestedPath("");
|
||||
assertThat(errors.hasErrors()).isTrue();
|
||||
assertThat(errors.getErrorCount()).isEqualTo(6);
|
||||
assertThat(errors.getAllErrors())
|
||||
.containsAll(errors.getGlobalErrors())
|
||||
.containsAll(errors.getFieldErrors());
|
||||
|
||||
assertThat(errors.hasGlobalErrors()).isTrue();
|
||||
assertThat(errors.getGlobalErrorCount()).isEqualTo(2);
|
||||
assertThat(errors.getGlobalError().getCode()).isEqualTo("validation.NAME_TOUCHY_MISMATCH");
|
||||
assertThat((errors.getGlobalErrors().get(0)).getCode()).isEqualTo("validation.NAME_TOUCHY_MISMATCH");
|
||||
@@ -1332,11 +1343,62 @@ class DataBinderTests {
|
||||
}
|
||||
|
||||
@Test
|
||||
void validatorWithNestedObjectNull() {
|
||||
void validateObjectWithErrors() {
|
||||
TestBean tb = new TestBean();
|
||||
Errors errors = new BeanPropertyBindingResult(tb, "tb");
|
||||
Errors errors = new SimpleErrors(tb, "tb");
|
||||
|
||||
Validator testValidator = new TestBeanValidator();
|
||||
testValidator.validate(tb, errors);
|
||||
|
||||
assertThat(errors.hasErrors()).isTrue();
|
||||
assertThat(errors.getErrorCount()).isEqualTo(5);
|
||||
assertThat(errors.getAllErrors())
|
||||
.containsAll(errors.getGlobalErrors())
|
||||
.containsAll(errors.getFieldErrors());
|
||||
|
||||
assertThat(errors.hasGlobalErrors()).isTrue();
|
||||
assertThat(errors.getGlobalErrorCount()).isEqualTo(2);
|
||||
assertThat(errors.getGlobalError().getCode()).isEqualTo("NAME_TOUCHY_MISMATCH");
|
||||
assertThat((errors.getGlobalErrors().get(0)).getCode()).isEqualTo("NAME_TOUCHY_MISMATCH");
|
||||
assertThat((errors.getGlobalErrors().get(0)).getObjectName()).isEqualTo("tb");
|
||||
assertThat((errors.getGlobalErrors().get(1)).getCode()).isEqualTo("GENERAL_ERROR");
|
||||
assertThat((errors.getGlobalErrors().get(1)).getDefaultMessage()).isEqualTo("msg");
|
||||
assertThat((errors.getGlobalErrors().get(1)).getArguments()[0]).isEqualTo("arg");
|
||||
|
||||
assertThat(errors.hasFieldErrors()).isTrue();
|
||||
assertThat(errors.getFieldErrorCount()).isEqualTo(3);
|
||||
assertThat(errors.getFieldError().getCode()).isEqualTo("TOO_YOUNG");
|
||||
assertThat((errors.getFieldErrors().get(0)).getCode()).isEqualTo("TOO_YOUNG");
|
||||
assertThat((errors.getFieldErrors().get(0)).getField()).isEqualTo("age");
|
||||
assertThat((errors.getFieldErrors().get(1)).getCode()).isEqualTo("AGE_NOT_ODD");
|
||||
assertThat((errors.getFieldErrors().get(1)).getField()).isEqualTo("age");
|
||||
assertThat((errors.getFieldErrors().get(2)).getCode()).isEqualTo("NOT_ROD");
|
||||
assertThat((errors.getFieldErrors().get(2)).getField()).isEqualTo("name");
|
||||
|
||||
assertThat(errors.hasFieldErrors("age")).isTrue();
|
||||
assertThat(errors.getFieldErrorCount("age")).isEqualTo(2);
|
||||
assertThat(errors.getFieldError("age").getCode()).isEqualTo("TOO_YOUNG");
|
||||
assertThat((errors.getFieldErrors("age").get(0)).getCode()).isEqualTo("TOO_YOUNG");
|
||||
assertThat((errors.getFieldErrors("age").get(0)).getObjectName()).isEqualTo("tb");
|
||||
assertThat((errors.getFieldErrors("age").get(0)).getField()).isEqualTo("age");
|
||||
assertThat((errors.getFieldErrors("age").get(0)).getRejectedValue()).isEqualTo(0);
|
||||
assertThat((errors.getFieldErrors("age").get(1)).getCode()).isEqualTo("AGE_NOT_ODD");
|
||||
|
||||
assertThat(errors.hasFieldErrors("name")).isTrue();
|
||||
assertThat(errors.getFieldErrorCount("name")).isEqualTo(1);
|
||||
assertThat(errors.getFieldError("name").getCode()).isEqualTo("NOT_ROD");
|
||||
assertThat((errors.getFieldErrors("name").get(0)).getField()).isEqualTo("name");
|
||||
assertThat((errors.getFieldErrors("name").get(0)).getRejectedValue()).isNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
void validatorWithNestedObjectNull() {
|
||||
TestBean tb = new TestBean();
|
||||
Errors errors = new DataBinder(tb, "tb").getBindingResult();
|
||||
|
||||
Validator testValidator = new TestBeanValidator();
|
||||
testValidator.validate(tb, errors);
|
||||
|
||||
errors.setNestedPath("spouse.");
|
||||
assertThat(errors.getNestedPath()).isEqualTo("spouse.");
|
||||
spouseValidator.validate(tb.getSpouse(), errors);
|
||||
@@ -1353,13 +1415,12 @@ class DataBinderTests {
|
||||
void nestedValidatorWithoutNestedPath() {
|
||||
TestBean tb = new TestBean();
|
||||
tb.setName("XXX");
|
||||
Errors errors = new BeanPropertyBindingResult(tb, "tb");
|
||||
spouseValidator.validate(tb, errors);
|
||||
Errors errors = spouseValidator.validateObject(tb);
|
||||
|
||||
assertThat(errors.hasGlobalErrors()).isTrue();
|
||||
assertThat(errors.getGlobalErrorCount()).isEqualTo(1);
|
||||
assertThat(errors.getGlobalError().getCode()).isEqualTo("SPOUSE_NOT_AVAILABLE");
|
||||
assertThat((errors.getGlobalErrors().get(0)).getObjectName()).isEqualTo("tb");
|
||||
assertThat((errors.getGlobalErrors().get(0)).getObjectName()).isEqualTo("TestBean");
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -1770,7 +1831,7 @@ class DataBinderTests {
|
||||
binder.bind(pvs);
|
||||
Errors errors = binder.getBindingResult();
|
||||
|
||||
BeanPropertyBindingResult errors2 = new BeanPropertyBindingResult(rod, "person");
|
||||
Errors errors2 = new SimpleErrors(rod, "person");
|
||||
errors.rejectValue("name", "badName");
|
||||
errors.addAllErrors(errors2);
|
||||
|
||||
@@ -1805,16 +1866,16 @@ class DataBinderTests {
|
||||
tb.setName("myName");
|
||||
tb.setAge(99);
|
||||
|
||||
BeanPropertyBindingResult ex = new BeanPropertyBindingResult(tb, "tb");
|
||||
ex.reject("invalid");
|
||||
ex.rejectValue("age", "invalidField");
|
||||
Errors errors = new SimpleErrors(tb, "tb");
|
||||
errors.reject("invalid");
|
||||
errors.rejectValue("age", "invalidField");
|
||||
|
||||
StaticMessageSource ms = new StaticMessageSource();
|
||||
ms.addMessage("invalid", Locale.US, "general error");
|
||||
ms.addMessage("invalidField", Locale.US, "invalid field");
|
||||
|
||||
assertThat(ms.getMessage(ex.getGlobalError(), Locale.US)).isEqualTo("general error");
|
||||
assertThat(ms.getMessage(ex.getFieldError("age"), Locale.US)).isEqualTo("invalid field");
|
||||
assertThat(ms.getMessage(errors.getGlobalError(), Locale.US)).isEqualTo("general error");
|
||||
assertThat(ms.getMessage(errors.getFieldError("age"), Locale.US)).isEqualTo("invalid field");
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -1882,13 +1943,13 @@ class DataBinderTests {
|
||||
void autoGrowBeyondDefaultLimit() {
|
||||
TestBean testBean = new TestBean();
|
||||
DataBinder binder = new DataBinder(testBean, "testBean");
|
||||
|
||||
MutablePropertyValues mpvs = new MutablePropertyValues();
|
||||
mpvs.add("friends[256]", "");
|
||||
|
||||
assertThatExceptionOfType(InvalidPropertyException.class)
|
||||
.isThrownBy(() -> binder.bind(mpvs))
|
||||
.havingRootCause()
|
||||
.isInstanceOf(IndexOutOfBoundsException.class);
|
||||
.isThrownBy(() -> binder.bind(mpvs))
|
||||
.havingRootCause()
|
||||
.isInstanceOf(IndexOutOfBoundsException.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -1909,13 +1970,13 @@ class DataBinderTests {
|
||||
TestBean testBean = new TestBean();
|
||||
DataBinder binder = new DataBinder(testBean, "testBean");
|
||||
binder.setAutoGrowCollectionLimit(10);
|
||||
|
||||
MutablePropertyValues mpvs = new MutablePropertyValues();
|
||||
mpvs.add("friends[16]", "");
|
||||
|
||||
assertThatExceptionOfType(InvalidPropertyException.class)
|
||||
.isThrownBy(() -> binder.bind(mpvs))
|
||||
.havingRootCause()
|
||||
.isInstanceOf(IndexOutOfBoundsException.class);
|
||||
.isThrownBy(() -> binder.bind(mpvs))
|
||||
.havingRootCause()
|
||||
.isInstanceOf(IndexOutOfBoundsException.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -2165,6 +2226,7 @@ class DataBinderTests {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
private static class GrowingList<E> extends AbstractList<E> {
|
||||
|
||||
|
||||
@@ -22,6 +22,7 @@ import org.springframework.beans.testfixture.beans.TestBean;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
|
||||
import static org.assertj.core.api.Assertions.assertThatIllegalStateException;
|
||||
|
||||
/**
|
||||
* Unit tests for {@link ValidationUtils}.
|
||||
@@ -29,82 +30,93 @@ import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException
|
||||
* @author Juergen Hoeller
|
||||
* @author Rick Evans
|
||||
* @author Chris Beams
|
||||
* @author Arjen Poutsma
|
||||
* @since 08.10.2004
|
||||
*/
|
||||
public class ValidationUtilsTests {
|
||||
|
||||
private final Validator emptyValidator = Validator.forInstanceOf(TestBean.class, (testBean, errors) -> ValidationUtils.rejectIfEmpty(errors, "name", "EMPTY", "You must enter a name!"));
|
||||
private final Validator emptyValidator = Validator.forInstanceOf(TestBean.class, (testBean, errors) ->
|
||||
ValidationUtils.rejectIfEmpty(errors, "name", "EMPTY", "You must enter a name!"));
|
||||
|
||||
private final Validator emptyOrWhitespaceValidator = Validator.forInstanceOf(TestBean.class, (testBean, errors) ->
|
||||
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "EMPTY_OR_WHITESPACE", "You must enter a name!"));
|
||||
|
||||
private final Validator emptyOrWhitespaceValidator = Validator.forInstanceOf(TestBean.class, (testBean, errors) -> ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "EMPTY_OR_WHITESPACE", "You must enter a name!"));
|
||||
|
||||
@Test
|
||||
public void testInvokeValidatorWithNullValidator() throws Exception {
|
||||
public void testInvokeValidatorWithNullValidator() {
|
||||
TestBean tb = new TestBean();
|
||||
Errors errors = new BeanPropertyBindingResult(tb, "tb");
|
||||
Errors errors = new SimpleErrors(tb);
|
||||
assertThatIllegalArgumentException().isThrownBy(() ->
|
||||
ValidationUtils.invokeValidator(null, tb, errors));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testInvokeValidatorWithNullErrors() throws Exception {
|
||||
public void testInvokeValidatorWithNullErrors() {
|
||||
TestBean tb = new TestBean();
|
||||
assertThatIllegalArgumentException().isThrownBy(() ->
|
||||
ValidationUtils.invokeValidator(emptyValidator, tb, null));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testInvokeValidatorSunnyDay() throws Exception {
|
||||
public void testInvokeValidatorSunnyDay() {
|
||||
TestBean tb = new TestBean();
|
||||
Errors errors = new BeanPropertyBindingResult(tb, "tb");
|
||||
Errors errors = new SimpleErrors(tb);
|
||||
ValidationUtils.invokeValidator(emptyValidator, tb, errors);
|
||||
assertThat(errors.hasFieldErrors("name")).isTrue();
|
||||
assertThat(errors.getFieldError("name").getCode()).isEqualTo("EMPTY");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testValidationUtilsSunnyDay() throws Exception {
|
||||
public void testValidationUtilsSunnyDay() {
|
||||
TestBean tb = new TestBean("");
|
||||
|
||||
tb.setName(" ");
|
||||
Errors errors = new BeanPropertyBindingResult(tb, "tb");
|
||||
emptyValidator.validate(tb, errors);
|
||||
Errors errors = emptyValidator.validateObject(tb);
|
||||
assertThat(errors.hasFieldErrors("name")).isFalse();
|
||||
|
||||
tb.setName("Roddy");
|
||||
errors = new BeanPropertyBindingResult(tb, "tb");
|
||||
emptyValidator.validate(tb, errors);
|
||||
errors = emptyValidator.validateObject(tb);
|
||||
assertThat(errors.hasFieldErrors("name")).isFalse();
|
||||
|
||||
// Should not raise exception
|
||||
errors.failOnError(IllegalStateException::new);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testValidationUtilsNull() throws Exception {
|
||||
public void testValidationUtilsNull() {
|
||||
TestBean tb = new TestBean();
|
||||
Errors errors = new BeanPropertyBindingResult(tb, "tb");
|
||||
emptyValidator.validate(tb, errors);
|
||||
Errors errors = emptyValidator.validateObject(tb);
|
||||
assertThat(errors.hasFieldErrors("name")).isTrue();
|
||||
assertThat(errors.getFieldError("name").getCode()).isEqualTo("EMPTY");
|
||||
|
||||
assertThatIllegalStateException()
|
||||
.isThrownBy(() -> errors.failOnError(IllegalStateException::new))
|
||||
.withMessageContaining("'name'").withMessageContaining("EMPTY");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testValidationUtilsEmpty() throws Exception {
|
||||
public void testValidationUtilsEmpty() {
|
||||
TestBean tb = new TestBean("");
|
||||
Errors errors = new BeanPropertyBindingResult(tb, "tb");
|
||||
emptyValidator.validate(tb, errors);
|
||||
Errors errors = emptyValidator.validateObject(tb);
|
||||
assertThat(errors.hasFieldErrors("name")).isTrue();
|
||||
assertThat(errors.getFieldError("name").getCode()).isEqualTo("EMPTY");
|
||||
|
||||
assertThatIllegalStateException()
|
||||
.isThrownBy(() -> errors.failOnError(IllegalStateException::new))
|
||||
.withMessageContaining("'name'").withMessageContaining("EMPTY");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testValidationUtilsEmptyVariants() {
|
||||
TestBean tb = new TestBean();
|
||||
|
||||
Errors errors = new BeanPropertyBindingResult(tb, "tb");
|
||||
Errors errors = new SimpleErrors(tb);
|
||||
ValidationUtils.rejectIfEmpty(errors, "name", "EMPTY_OR_WHITESPACE", new Object[] {"arg"});
|
||||
assertThat(errors.hasFieldErrors("name")).isTrue();
|
||||
assertThat(errors.getFieldError("name").getCode()).isEqualTo("EMPTY_OR_WHITESPACE");
|
||||
assertThat(errors.getFieldError("name").getArguments()[0]).isEqualTo("arg");
|
||||
|
||||
errors = new BeanPropertyBindingResult(tb, "tb");
|
||||
errors = new SimpleErrors(tb);
|
||||
ValidationUtils.rejectIfEmpty(errors, "name", "EMPTY_OR_WHITESPACE", new Object[] {"arg"}, "msg");
|
||||
assertThat(errors.hasFieldErrors("name")).isTrue();
|
||||
assertThat(errors.getFieldError("name").getCode()).isEqualTo("EMPTY_OR_WHITESPACE");
|
||||
@@ -113,33 +125,29 @@ public class ValidationUtilsTests {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testValidationUtilsEmptyOrWhitespace() throws Exception {
|
||||
public void testValidationUtilsEmptyOrWhitespace() {
|
||||
TestBean tb = new TestBean();
|
||||
|
||||
// Test null
|
||||
Errors errors = new BeanPropertyBindingResult(tb, "tb");
|
||||
emptyOrWhitespaceValidator.validate(tb, errors);
|
||||
Errors errors = emptyOrWhitespaceValidator.validateObject(tb);
|
||||
assertThat(errors.hasFieldErrors("name")).isTrue();
|
||||
assertThat(errors.getFieldError("name").getCode()).isEqualTo("EMPTY_OR_WHITESPACE");
|
||||
|
||||
// Test empty String
|
||||
tb.setName("");
|
||||
errors = new BeanPropertyBindingResult(tb, "tb");
|
||||
emptyOrWhitespaceValidator.validate(tb, errors);
|
||||
errors = emptyOrWhitespaceValidator.validateObject(tb);
|
||||
assertThat(errors.hasFieldErrors("name")).isTrue();
|
||||
assertThat(errors.getFieldError("name").getCode()).isEqualTo("EMPTY_OR_WHITESPACE");
|
||||
|
||||
// Test whitespace String
|
||||
tb.setName(" ");
|
||||
errors = new BeanPropertyBindingResult(tb, "tb");
|
||||
emptyOrWhitespaceValidator.validate(tb, errors);
|
||||
errors = emptyOrWhitespaceValidator.validateObject(tb);
|
||||
assertThat(errors.hasFieldErrors("name")).isTrue();
|
||||
assertThat(errors.getFieldError("name").getCode()).isEqualTo("EMPTY_OR_WHITESPACE");
|
||||
|
||||
// Test OK
|
||||
tb.setName("Roddy");
|
||||
errors = new BeanPropertyBindingResult(tb, "tb");
|
||||
emptyOrWhitespaceValidator.validate(tb, errors);
|
||||
errors = emptyOrWhitespaceValidator.validateObject(tb);
|
||||
assertThat(errors.hasFieldErrors("name")).isFalse();
|
||||
}
|
||||
|
||||
@@ -148,13 +156,13 @@ public class ValidationUtilsTests {
|
||||
TestBean tb = new TestBean();
|
||||
tb.setName(" ");
|
||||
|
||||
Errors errors = new BeanPropertyBindingResult(tb, "tb");
|
||||
Errors errors = new SimpleErrors(tb);
|
||||
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "EMPTY_OR_WHITESPACE", new Object[] {"arg"});
|
||||
assertThat(errors.hasFieldErrors("name")).isTrue();
|
||||
assertThat(errors.getFieldError("name").getCode()).isEqualTo("EMPTY_OR_WHITESPACE");
|
||||
assertThat(errors.getFieldError("name").getArguments()[0]).isEqualTo("arg");
|
||||
|
||||
errors = new BeanPropertyBindingResult(tb, "tb");
|
||||
errors = new SimpleErrors(tb);
|
||||
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "EMPTY_OR_WHITESPACE", new Object[] {"arg"}, "msg");
|
||||
assertThat(errors.hasFieldErrors("name")).isTrue();
|
||||
assertThat(errors.getFieldError("name").getCode()).isEqualTo("EMPTY_OR_WHITESPACE");
|
||||
|
||||
Reference in New Issue
Block a user