Support constructing target object in DataBinder
See gh-26721
This commit is contained in:
@@ -26,6 +26,7 @@ import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.beans.testfixture.beans.TestBean;
|
||||
import org.springframework.core.MethodParameter;
|
||||
import org.springframework.core.ResolvableType;
|
||||
import org.springframework.core.annotation.SynthesizingMethodParameter;
|
||||
import org.springframework.format.support.DefaultFormattingConversionService;
|
||||
import org.springframework.validation.BindingResult;
|
||||
@@ -51,7 +52,7 @@ import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.ArgumentMatchers.eq;
|
||||
import static org.mockito.ArgumentMatchers.notNull;
|
||||
import static org.mockito.ArgumentMatchers.isNull;
|
||||
import static org.mockito.BDDMockito.given;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.verify;
|
||||
@@ -161,11 +162,13 @@ public class ModelAttributeMethodProcessorTests {
|
||||
@Test
|
||||
public void resolveArgumentViaDefaultConstructor() throws Exception {
|
||||
WebDataBinder dataBinder = new WebRequestDataBinder(null);
|
||||
dataBinder.setTargetType(ResolvableType.forMethodParameter(this.paramNamedValidModelAttr));
|
||||
|
||||
WebDataBinderFactory factory = mock();
|
||||
given(factory.createBinder(any(), notNull(), eq("attrName"), any())).willReturn(dataBinder);
|
||||
given(factory.createBinder(any(), isNull(), eq("attrName"), any())).willReturn(dataBinder);
|
||||
|
||||
this.processor.resolveArgument(this.paramNamedValidModelAttr, this.container, this.request, factory);
|
||||
verify(factory).createBinder(any(), notNull(), eq("attrName"), any());
|
||||
verify(factory).createBinder(any(), isNull(), eq("attrName"), any());
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -281,6 +284,7 @@ public class ModelAttributeMethodProcessorTests {
|
||||
given(factory.createBinder(any(), any(), eq("testBeanWithConstructorArgs"), any()))
|
||||
.willAnswer(invocation -> {
|
||||
WebRequestDataBinder binder = new WebRequestDataBinder(invocation.getArgument(1));
|
||||
binder.setTargetType(ResolvableType.forMethodParameter(this.beanWithConstructorArgs));
|
||||
// Add conversion service which will convert "1,2" to a list
|
||||
binder.setConversionService(new DefaultFormattingConversionService());
|
||||
return binder;
|
||||
|
||||
@@ -20,10 +20,12 @@ import org.assertj.core.api.Assertions.assertThat
|
||||
import org.assertj.core.api.Assertions.assertThatThrownBy
|
||||
import org.junit.jupiter.api.BeforeEach
|
||||
import org.junit.jupiter.api.Test
|
||||
import org.mockito.ArgumentMatchers.*
|
||||
import org.mockito.ArgumentMatchers.any
|
||||
import org.mockito.ArgumentMatchers.eq
|
||||
import org.mockito.BDDMockito.given
|
||||
import org.mockito.Mockito.mock
|
||||
import org.springframework.core.MethodParameter
|
||||
import org.springframework.core.ResolvableType
|
||||
import org.springframework.core.annotation.SynthesizingMethodParameter
|
||||
import org.springframework.web.bind.MethodArgumentNotValidException
|
||||
import org.springframework.web.bind.support.WebDataBinderFactory
|
||||
@@ -31,7 +33,6 @@ import org.springframework.web.bind.support.WebRequestDataBinder
|
||||
import org.springframework.web.context.request.ServletWebRequest
|
||||
import org.springframework.web.method.support.ModelAndViewContainer
|
||||
import org.springframework.web.testfixture.servlet.MockHttpServletRequest
|
||||
import kotlin.annotation.AnnotationTarget.*
|
||||
|
||||
/**
|
||||
* Kotlin test fixture for [ModelAttributeMethodProcessor].
|
||||
@@ -61,7 +62,11 @@ class ModelAttributeMethodProcessorKotlinTests {
|
||||
val requestWithParam = ServletWebRequest(mockRequest)
|
||||
val factory = mock<WebDataBinderFactory>()
|
||||
given(factory.createBinder(any(), any(), eq("param"), any()))
|
||||
.willAnswer { WebRequestDataBinder(it.getArgument(1)) }
|
||||
.willAnswer {
|
||||
val binder = WebRequestDataBinder(it.getArgument(1))
|
||||
binder.setTargetType(ResolvableType.forMethodParameter(this.param))
|
||||
binder
|
||||
}
|
||||
assertThat(processor.resolveArgument(this.param, container, requestWithParam, factory)).isEqualTo(Param("b"))
|
||||
}
|
||||
|
||||
@@ -71,7 +76,11 @@ class ModelAttributeMethodProcessorKotlinTests {
|
||||
val requestWithParam = ServletWebRequest(mockRequest)
|
||||
val factory = mock<WebDataBinderFactory>()
|
||||
given(factory.createBinder(any(), any(), eq("param"), any()))
|
||||
.willAnswer { WebRequestDataBinder(it.getArgument(1)) }
|
||||
.willAnswer {
|
||||
val binder = WebRequestDataBinder(it.getArgument(1))
|
||||
binder.setTargetType(ResolvableType.forMethodParameter(this.param))
|
||||
binder
|
||||
}
|
||||
assertThatThrownBy {
|
||||
processor.resolveArgument(this.param, container, requestWithParam, factory)
|
||||
}.isInstanceOf(MethodArgumentNotValidException::class.java)
|
||||
|
||||
Reference in New Issue
Block a user