Browse Source

Polishing

pull/27047/merge
Sam Brannen 3 years ago
parent
commit
2d56505ea9
  1. 44
      spring-context/src/test/java/org/springframework/aop/aspectj/autoproxy/AspectJAutoProxyCreatorTests.java
  2. 45
      spring-core/src/test/java/org/springframework/core/io/ResourceTests.java
  3. 2
      spring-core/src/test/java/org/springframework/core/io/buffer/DataBufferTests.java
  4. 1
      spring-messaging/src/test/java/org/springframework/messaging/rsocket/MetadataEncoderTests.java
  5. 154
      spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/RequestMappingMessageConversionIntegrationTests.java
  6. 55
      spring-webflux/src/test/java/org/springframework/web/reactive/result/view/freemarker/FreeMarkerViewTests.java
  7. 97
      spring-webmvc/src/test/java/org/springframework/web/servlet/view/freemarker/FreeMarkerViewTests.java

44
spring-context/src/test/java/org/springframework/aop/aspectj/autoproxy/AspectJAutoProxyCreatorTests.java

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2022 the original author or authors. * Copyright 2002-2023 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -77,10 +77,10 @@ import static org.assertj.core.api.Assertions.assertThat;
* @author Chris Beams * @author Chris Beams
* @author Sam Brannen * @author Sam Brannen
*/ */
public class AspectJAutoProxyCreatorTests { class AspectJAutoProxyCreatorTests {
@Test @Test
public void testAspectsAreApplied() { void aspectsAreApplied() {
ClassPathXmlApplicationContext bf = newContext("aspects.xml"); ClassPathXmlApplicationContext bf = newContext("aspects.xml");
ITestBean tb = (ITestBean) bf.getBean("adrian"); ITestBean tb = (ITestBean) bf.getBean("adrian");
@ -91,7 +91,7 @@ public class AspectJAutoProxyCreatorTests {
} }
@Test @Test
public void testMultipleAspectsWithParameterApplied() { void multipleAspectsWithParameterApplied() {
ClassPathXmlApplicationContext bf = newContext("aspects.xml"); ClassPathXmlApplicationContext bf = newContext("aspects.xml");
ITestBean tb = (ITestBean) bf.getBean("adrian"); ITestBean tb = (ITestBean) bf.getBean("adrian");
@ -100,7 +100,7 @@ public class AspectJAutoProxyCreatorTests {
} }
@Test @Test
public void testAspectsAreAppliedInDefinedOrder() { void aspectsAreAppliedInDefinedOrder() {
ClassPathXmlApplicationContext bf = newContext("aspectsWithOrdering.xml"); ClassPathXmlApplicationContext bf = newContext("aspectsWithOrdering.xml");
ITestBean tb = (ITestBean) bf.getBean("adrian"); ITestBean tb = (ITestBean) bf.getBean("adrian");
@ -108,7 +108,7 @@ public class AspectJAutoProxyCreatorTests {
} }
@Test @Test
public void testAspectsAndAdvisorAreApplied() { void aspectsAndAdvisorAreApplied() {
ClassPathXmlApplicationContext ac = newContext("aspectsPlusAdvisor.xml"); ClassPathXmlApplicationContext ac = newContext("aspectsPlusAdvisor.xml");
ITestBean shouldBeWeaved = (ITestBean) ac.getBean("adrian"); ITestBean shouldBeWeaved = (ITestBean) ac.getBean("adrian");
@ -116,7 +116,7 @@ public class AspectJAutoProxyCreatorTests {
} }
@Test @Test
public void testAspectsAndAdvisorAreAppliedEvenIfComingFromParentFactory() { void aspectsAndAdvisorAreAppliedEvenIfComingFromParentFactory() {
ClassPathXmlApplicationContext ac = newContext("aspectsPlusAdvisor.xml"); ClassPathXmlApplicationContext ac = newContext("aspectsPlusAdvisor.xml");
GenericApplicationContext childAc = new GenericApplicationContext(ac); GenericApplicationContext childAc = new GenericApplicationContext(ac);
@ -153,7 +153,7 @@ public class AspectJAutoProxyCreatorTests {
} }
@Test @Test
public void testPerThisAspect() { void perThisAspect() {
ClassPathXmlApplicationContext bf = newContext("perthis.xml"); ClassPathXmlApplicationContext bf = newContext("perthis.xml");
ITestBean adrian1 = (ITestBean) bf.getBean("adrian"); ITestBean adrian1 = (ITestBean) bf.getBean("adrian");
@ -173,7 +173,7 @@ public class AspectJAutoProxyCreatorTests {
} }
@Test @Test
public void testPerTargetAspect() throws SecurityException, NoSuchMethodException { void perTargetAspect() throws SecurityException, NoSuchMethodException {
ClassPathXmlApplicationContext bf = newContext("pertarget.xml"); ClassPathXmlApplicationContext bf = newContext("pertarget.xml");
ITestBean adrian1 = (ITestBean) bf.getBean("adrian"); ITestBean adrian1 = (ITestBean) bf.getBean("adrian");
@ -209,7 +209,7 @@ public class AspectJAutoProxyCreatorTests {
} }
@Test @Test
public void testTwoAdviceAspect() { void twoAdviceAspect() {
ClassPathXmlApplicationContext bf = newContext("twoAdviceAspect.xml"); ClassPathXmlApplicationContext bf = newContext("twoAdviceAspect.xml");
ITestBean adrian1 = (ITestBean) bf.getBean("adrian"); ITestBean adrian1 = (ITestBean) bf.getBean("adrian");
@ -217,7 +217,7 @@ public class AspectJAutoProxyCreatorTests {
} }
@Test @Test
public void testTwoAdviceAspectSingleton() { void twoAdviceAspectSingleton() {
ClassPathXmlApplicationContext bf = newContext("twoAdviceAspectSingleton.xml"); ClassPathXmlApplicationContext bf = newContext("twoAdviceAspectSingleton.xml");
ITestBean adrian1 = (ITestBean) bf.getBean("adrian"); ITestBean adrian1 = (ITestBean) bf.getBean("adrian");
@ -228,7 +228,7 @@ public class AspectJAutoProxyCreatorTests {
} }
@Test @Test
public void testTwoAdviceAspectPrototype() { void twoAdviceAspectPrototype() {
ClassPathXmlApplicationContext bf = newContext("twoAdviceAspectPrototype.xml"); ClassPathXmlApplicationContext bf = newContext("twoAdviceAspectPrototype.xml");
ITestBean adrian1 = (ITestBean) bf.getBean("adrian"); ITestBean adrian1 = (ITestBean) bf.getBean("adrian");
@ -244,13 +244,13 @@ public class AspectJAutoProxyCreatorTests {
assertThat(adrian.age()).isEqualTo(start); assertThat(adrian.age()).isEqualTo(start);
int newAge = 32; int newAge = 32;
adrian.setAge(newAge); adrian.setAge(newAge);
assertThat(adrian.age()).isEqualTo((start + increment)); assertThat(adrian.age()).isEqualTo(start + increment);
adrian.setAge(0); adrian.setAge(0);
assertThat(adrian.age()).isEqualTo((start + increment * 2)); assertThat(adrian.age()).isEqualTo(start + increment * 2);
} }
@Test @Test
public void testAdviceUsingJoinPoint() { void adviceUsingJoinPoint() {
ClassPathXmlApplicationContext bf = newContext("usesJoinPointAspect.xml"); ClassPathXmlApplicationContext bf = newContext("usesJoinPointAspect.xml");
ITestBean adrian1 = (ITestBean) bf.getBean("adrian"); ITestBean adrian1 = (ITestBean) bf.getBean("adrian");
@ -262,7 +262,7 @@ public class AspectJAutoProxyCreatorTests {
} }
@Test @Test
public void testIncludeMechanism() { void includeMechanism() {
ClassPathXmlApplicationContext bf = newContext("usesInclude.xml"); ClassPathXmlApplicationContext bf = newContext("usesInclude.xml");
ITestBean adrian = (ITestBean) bf.getBean("adrian"); ITestBean adrian = (ITestBean) bf.getBean("adrian");
@ -271,7 +271,7 @@ public class AspectJAutoProxyCreatorTests {
} }
@Test @Test
public void testForceProxyTargetClass() { void forceProxyTargetClass() {
ClassPathXmlApplicationContext bf = newContext("aspectsWithCGLIB.xml"); ClassPathXmlApplicationContext bf = newContext("aspectsWithCGLIB.xml");
ProxyConfig pc = (ProxyConfig) bf.getBean(AopConfigUtils.AUTO_PROXY_CREATOR_BEAN_NAME); ProxyConfig pc = (ProxyConfig) bf.getBean(AopConfigUtils.AUTO_PROXY_CREATOR_BEAN_NAME);
@ -280,7 +280,7 @@ public class AspectJAutoProxyCreatorTests {
} }
@Test @Test
public void testWithAbstractFactoryBeanAreApplied() { void withAbstractFactoryBeanAreApplied() {
ClassPathXmlApplicationContext bf = newContext("aspectsWithAbstractBean.xml"); ClassPathXmlApplicationContext bf = newContext("aspectsWithAbstractBean.xml");
ITestBean adrian = (ITestBean) bf.getBean("adrian"); ITestBean adrian = (ITestBean) bf.getBean("adrian");
@ -289,7 +289,7 @@ public class AspectJAutoProxyCreatorTests {
} }
@Test @Test
public void testRetryAspect() { void retryAspect() {
ClassPathXmlApplicationContext bf = newContext("retryAspect.xml"); ClassPathXmlApplicationContext bf = newContext("retryAspect.xml");
UnreliableBean bean = (UnreliableBean) bf.getBean("unreliableBean"); UnreliableBean bean = (UnreliableBean) bf.getBean("unreliableBean");
@ -302,7 +302,7 @@ public class AspectJAutoProxyCreatorTests {
} }
@Test @Test
public void testWithBeanNameAutoProxyCreator() { void withBeanNameAutoProxyCreator() {
ClassPathXmlApplicationContext bf = newContext("withBeanNameAutoProxyCreator.xml"); ClassPathXmlApplicationContext bf = newContext("withBeanNameAutoProxyCreator.xml");
ITestBean tb = (ITestBean) bf.getBean("adrian"); ITestBean tb = (ITestBean) bf.getBean("adrian");
@ -571,11 +571,11 @@ class RetryAspect {
@SuppressWarnings("serial") @SuppressWarnings("serial")
class RetryableException extends NestedRuntimeException { class RetryableException extends NestedRuntimeException {
public RetryableException(String msg) { RetryableException(String msg) {
super(msg); super(msg);
} }
public RetryableException(String msg, Throwable cause) { RetryableException(String msg, Throwable cause) {
super(msg, cause); super(msg, cause);
} }
} }

45
spring-core/src/test/java/org/springframework/core/io/ResourceTests.java

@ -40,7 +40,6 @@ import okhttp3.mockwebserver.MockResponse;
import okhttp3.mockwebserver.MockWebServer; import okhttp3.mockwebserver.MockWebServer;
import okhttp3.mockwebserver.RecordedRequest; import okhttp3.mockwebserver.RecordedRequest;
import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Named;
import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.ParameterizedTest;
@ -49,9 +48,12 @@ import org.junit.jupiter.params.provider.MethodSource;
import org.springframework.util.FileCopyUtils; import org.springframework.util.FileCopyUtils;
import static java.nio.charset.StandardCharsets.UTF_8;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatExceptionOfType; import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
import static org.assertj.core.api.Assertions.assertThatIllegalStateException; import static org.assertj.core.api.Assertions.assertThatIllegalStateException;
import static org.junit.jupiter.api.Named.named;
import static org.junit.jupiter.params.provider.Arguments.arguments;
/** /**
* Unit tests for various {@link Resource} implementations. * Unit tests for various {@link Resource} implementations.
@ -67,11 +69,11 @@ class ResourceTests {
@MethodSource("resource") @MethodSource("resource")
void resourceIsValid(Resource resource) throws Exception { void resourceIsValid(Resource resource) throws Exception {
assertThat(resource.getFilename()).isEqualTo("Resource.class"); assertThat(resource.getFilename()).isEqualTo("Resource.class");
assertThat(resource.getURL().getFile().endsWith("Resource.class")).isTrue(); assertThat(resource.getURL().getFile()).endsWith("Resource.class");
assertThat(resource.exists()).isTrue(); assertThat(resource.exists()).isTrue();
assertThat(resource.isReadable()).isTrue(); assertThat(resource.isReadable()).isTrue();
assertThat(resource.contentLength() > 0).isTrue(); assertThat(resource.contentLength()).isGreaterThan(0);
assertThat(resource.lastModified() > 0).isTrue(); assertThat(resource.lastModified()).isGreaterThan(0);
assertThat(resource.getContentAsByteArray()).containsExactly(Files.readAllBytes(Path.of(resource.getURI()))); assertThat(resource.getContentAsByteArray()).containsExactly(Files.readAllBytes(Path.of(resource.getURI())));
} }
@ -83,8 +85,8 @@ class ResourceTests {
assertThat(relative1.getURL().getFile().endsWith("ClassPathResource.class")).isTrue(); assertThat(relative1.getURL().getFile().endsWith("ClassPathResource.class")).isTrue();
assertThat(relative1.exists()).isTrue(); assertThat(relative1.exists()).isTrue();
assertThat(relative1.isReadable()).isTrue(); assertThat(relative1.isReadable()).isTrue();
assertThat(relative1.contentLength() > 0).isTrue(); assertThat(relative1.contentLength()).isGreaterThan(0);
assertThat(relative1.lastModified() > 0).isTrue(); assertThat(relative1.lastModified()).isGreaterThan(0);
} }
@ParameterizedTest(name = "{index}: {0}") @ParameterizedTest(name = "{index}: {0}")
@ -92,11 +94,11 @@ class ResourceTests {
void resourceCreateRelativeWithFolder(Resource resource) throws Exception { void resourceCreateRelativeWithFolder(Resource resource) throws Exception {
Resource relative2 = resource.createRelative("support/ResourcePatternResolver.class"); Resource relative2 = resource.createRelative("support/ResourcePatternResolver.class");
assertThat(relative2.getFilename()).isEqualTo("ResourcePatternResolver.class"); assertThat(relative2.getFilename()).isEqualTo("ResourcePatternResolver.class");
assertThat(relative2.getURL().getFile().endsWith("ResourcePatternResolver.class")).isTrue(); assertThat(relative2.getURL().getFile()).endsWith("ResourcePatternResolver.class");
assertThat(relative2.exists()).isTrue(); assertThat(relative2.exists()).isTrue();
assertThat(relative2.isReadable()).isTrue(); assertThat(relative2.isReadable()).isTrue();
assertThat(relative2.contentLength() > 0).isTrue(); assertThat(relative2.contentLength()).isGreaterThan(0);
assertThat(relative2.lastModified() > 0).isTrue(); assertThat(relative2.lastModified()).isGreaterThan(0);
} }
@ParameterizedTest(name = "{index}: {0}") @ParameterizedTest(name = "{index}: {0}")
@ -104,11 +106,11 @@ class ResourceTests {
void resourceCreateRelativeWithDotPath(Resource resource) throws Exception { void resourceCreateRelativeWithDotPath(Resource resource) throws Exception {
Resource relative3 = resource.createRelative("../SpringVersion.class"); Resource relative3 = resource.createRelative("../SpringVersion.class");
assertThat(relative3.getFilename()).isEqualTo("SpringVersion.class"); assertThat(relative3.getFilename()).isEqualTo("SpringVersion.class");
assertThat(relative3.getURL().getFile().endsWith("SpringVersion.class")).isTrue(); assertThat(relative3.getURL().getFile()).endsWith("SpringVersion.class");
assertThat(relative3.exists()).isTrue(); assertThat(relative3.exists()).isTrue();
assertThat(relative3.isReadable()).isTrue(); assertThat(relative3.isReadable()).isTrue();
assertThat(relative3.contentLength() > 0).isTrue(); assertThat(relative3.contentLength()).isGreaterThan(0);
assertThat(relative3.lastModified() > 0).isTrue(); assertThat(relative3.lastModified()).isGreaterThan(0);
} }
@ParameterizedTest(name = "{index}: {0}") @ParameterizedTest(name = "{index}: {0}")
@ -122,21 +124,20 @@ class ResourceTests {
assertThatExceptionOfType(FileNotFoundException.class).isThrownBy(relative4::getInputStream); assertThatExceptionOfType(FileNotFoundException.class).isThrownBy(relative4::getInputStream);
assertThatExceptionOfType(FileNotFoundException.class).isThrownBy(relative4::readableChannel); assertThatExceptionOfType(FileNotFoundException.class).isThrownBy(relative4::readableChannel);
assertThatExceptionOfType(FileNotFoundException.class).isThrownBy(relative4::getContentAsByteArray); assertThatExceptionOfType(FileNotFoundException.class).isThrownBy(relative4::getContentAsByteArray);
assertThatExceptionOfType(FileNotFoundException.class).isThrownBy( assertThatExceptionOfType(FileNotFoundException.class).isThrownBy(() -> relative4.getContentAsString(UTF_8));
() -> relative4.getContentAsString(StandardCharsets.UTF_8));
} }
private static Stream<Arguments> resource() throws URISyntaxException { private static Stream<Arguments> resource() throws URISyntaxException {
URL resourceClass = ResourceTests.class.getResource("Resource.class"); URL resourceClass = ResourceTests.class.getResource("Resource.class");
Path resourceClassFilePath = Paths.get(resourceClass.toURI()); Path resourceClassFilePath = Paths.get(resourceClass.toURI());
return Stream.of( return Stream.of(
Arguments.of(Named.of("ClassPathResource", new ClassPathResource("org/springframework/core/io/Resource.class"))), arguments(named("ClassPathResource", new ClassPathResource("org/springframework/core/io/Resource.class"))),
Arguments.of(Named.of("ClassPathResource with ClassLoader", new ClassPathResource("org/springframework/core/io/Resource.class", ResourceTests.class.getClassLoader()))), arguments(named("ClassPathResource with ClassLoader", new ClassPathResource("org/springframework/core/io/Resource.class", ResourceTests.class.getClassLoader()))),
Arguments.of(Named.of("ClassPathResource with Class", new ClassPathResource("Resource.class", ResourceTests.class))), arguments(named("ClassPathResource with Class", new ClassPathResource("Resource.class", ResourceTests.class))),
Arguments.of(Named.of("FileSystemResource", new FileSystemResource(resourceClass.getFile()))), arguments(named("FileSystemResource", new FileSystemResource(resourceClass.getFile()))),
Arguments.of(Named.of("FileSystemResource with File", new FileSystemResource(new File(resourceClass.getFile())))), arguments(named("FileSystemResource with File", new FileSystemResource(new File(resourceClass.getFile())))),
Arguments.of(Named.of("FileSystemResource with File path", new FileSystemResource(resourceClassFilePath))), arguments(named("FileSystemResource with File path", new FileSystemResource(resourceClassFilePath))),
Arguments.of(Named.of("UrlResource", new UrlResource(resourceClass))) arguments(named("UrlResource", new UrlResource(resourceClass)))
); );
} }
@ -258,7 +259,7 @@ class ResourceTests {
ByteBuffer buffer = ByteBuffer.allocate((int) resource.contentLength()); ByteBuffer buffer = ByteBuffer.allocate((int) resource.contentLength());
channel.read(buffer); channel.read(buffer);
buffer.rewind(); buffer.rewind();
assertThat(buffer.limit() > 0).isTrue(); assertThat(buffer.limit()).isGreaterThan(0);
} }
} }

2
spring-core/src/test/java/org/springframework/core/io/buffer/DataBufferTests.java

@ -621,6 +621,7 @@ class DataBufferTests extends AbstractDataBufferAllocatingTests {
buffer.write(new byte[]{'a', 'b', 'c'}); buffer.write(new byte[]{'a', 'b', 'c'});
buffer.read(); // skip a buffer.read(); // skip a
@SuppressWarnings("deprecation")
ByteBuffer result = buffer.toByteBuffer(); ByteBuffer result = buffer.toByteBuffer();
assertThat(result.capacity()).isEqualTo(2); assertThat(result.capacity()).isEqualTo(2);
assertThat(result.remaining()).isEqualTo(2); assertThat(result.remaining()).isEqualTo(2);
@ -639,6 +640,7 @@ class DataBufferTests extends AbstractDataBufferAllocatingTests {
DataBuffer buffer = createDataBuffer(3); DataBuffer buffer = createDataBuffer(3);
buffer.write(new byte[]{'a', 'b', 'c'}); buffer.write(new byte[]{'a', 'b', 'c'});
@SuppressWarnings("deprecation")
ByteBuffer result = buffer.toByteBuffer(1, 2); ByteBuffer result = buffer.toByteBuffer(1, 2);
assertThat(result.capacity()).isEqualTo(2); assertThat(result.capacity()).isEqualTo(2);
assertThat(result.remaining()).isEqualTo(2); assertThat(result.remaining()).isEqualTo(2);

1
spring-messaging/src/test/java/org/springframework/messaging/rsocket/MetadataEncoderTests.java

@ -211,6 +211,7 @@ class MetadataEncoderTests {
.encode() .encode()
.block(); .block();
@SuppressWarnings("deprecation")
ByteBuf byteBuf = new NettyDataBufferFactory(ByteBufAllocator.DEFAULT) ByteBuf byteBuf = new NettyDataBufferFactory(ByteBufAllocator.DEFAULT)
.wrap(buffer.toByteBuffer()) .wrap(buffer.toByteBuffer())
.getNativeBuffer(); .getNativeBuffer();

154
spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/RequestMappingMessageConversionIntegrationTests.java

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2022 the original author or authors. * Copyright 2002-2023 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -68,7 +68,7 @@ import static org.springframework.http.MediaType.APPLICATION_XML;
* @author Rossen Stoyanchev * @author Rossen Stoyanchev
* @author Sebastien Deleuze * @author Sebastien Deleuze
*/ */
public class RequestMappingMessageConversionIntegrationTests extends AbstractRequestMappingIntegrationTests { class RequestMappingMessageConversionIntegrationTests extends AbstractRequestMappingIntegrationTests {
private static final ParameterizedTypeReference<List<Person>> PERSON_LIST = private static final ParameterizedTypeReference<List<Person>> PERSON_LIST =
new ParameterizedTypeReference<>() {}; new ParameterizedTypeReference<>() {};
@ -78,15 +78,12 @@ public class RequestMappingMessageConversionIntegrationTests extends AbstractReq
@Override @Override
protected ApplicationContext initApplicationContext() { protected ApplicationContext initApplicationContext() {
AnnotationConfigApplicationContext wac = new AnnotationConfigApplicationContext(); return new AnnotationConfigApplicationContext(WebConfig.class);
wac.register(WebConfig.class);
wac.refresh();
return wac;
} }
@ParameterizedHttpServerTest @ParameterizedHttpServerTest
public void byteBufferResponseBodyWithPublisher(HttpServer httpServer) throws Exception { void byteBufferResponseBodyWithPublisher(HttpServer httpServer) throws Exception {
startServer(httpServer); startServer(httpServer);
Person expected = new Person("Robert"); Person expected = new Person("Robert");
@ -94,7 +91,7 @@ public class RequestMappingMessageConversionIntegrationTests extends AbstractReq
} }
@ParameterizedHttpServerTest @ParameterizedHttpServerTest
public void byteBufferResponseBodyWithFlux(HttpServer httpServer) throws Exception { void byteBufferResponseBodyWithFlux(HttpServer httpServer) throws Exception {
startServer(httpServer); startServer(httpServer);
String expected = "Hello!"; String expected = "Hello!";
@ -102,7 +99,7 @@ public class RequestMappingMessageConversionIntegrationTests extends AbstractReq
} }
@ParameterizedHttpServerTest @ParameterizedHttpServerTest
public void byteBufferResponseBodyWithMono(HttpServer httpServer) throws Exception { void byteBufferResponseBodyWithMono(HttpServer httpServer) throws Exception {
startServer(httpServer); startServer(httpServer);
String expected = "Hello!"; String expected = "Hello!";
@ -112,7 +109,7 @@ public class RequestMappingMessageConversionIntegrationTests extends AbstractReq
} }
@ParameterizedHttpServerTest @ParameterizedHttpServerTest
public void byteBufferResponseBodyWithObservable(HttpServer httpServer) throws Exception { void byteBufferResponseBodyWithObservable(HttpServer httpServer) throws Exception {
startServer(httpServer); startServer(httpServer);
String expected = "Hello!"; String expected = "Hello!";
@ -121,7 +118,7 @@ public class RequestMappingMessageConversionIntegrationTests extends AbstractReq
} }
@ParameterizedHttpServerTest @ParameterizedHttpServerTest
public void byteBufferResponseBodyWithFlowable(HttpServer httpServer) throws Exception { void byteBufferResponseBodyWithFlowable(HttpServer httpServer) throws Exception {
startServer(httpServer); startServer(httpServer);
String expected = "Hello!"; String expected = "Hello!";
@ -129,7 +126,7 @@ public class RequestMappingMessageConversionIntegrationTests extends AbstractReq
} }
@ParameterizedHttpServerTest @ParameterizedHttpServerTest
public void personResponseBody(HttpServer httpServer) throws Exception { void personResponseBody(HttpServer httpServer) throws Exception {
startServer(httpServer); startServer(httpServer);
Person expected = new Person("Robert"); Person expected = new Person("Robert");
@ -139,7 +136,7 @@ public class RequestMappingMessageConversionIntegrationTests extends AbstractReq
} }
@ParameterizedHttpServerTest @ParameterizedHttpServerTest
public void personResponseBodyWithCompletableFuture(HttpServer httpServer) throws Exception { void personResponseBodyWithCompletableFuture(HttpServer httpServer) throws Exception {
startServer(httpServer); startServer(httpServer);
Person expected = new Person("Robert"); Person expected = new Person("Robert");
@ -149,7 +146,7 @@ public class RequestMappingMessageConversionIntegrationTests extends AbstractReq
} }
@ParameterizedHttpServerTest @ParameterizedHttpServerTest
public void personResponseBodyWithMono(HttpServer httpServer) throws Exception { void personResponseBodyWithMono(HttpServer httpServer) throws Exception {
startServer(httpServer); startServer(httpServer);
Person expected = new Person("Robert"); Person expected = new Person("Robert");
@ -159,7 +156,7 @@ public class RequestMappingMessageConversionIntegrationTests extends AbstractReq
} }
@ParameterizedHttpServerTest // SPR-17506 @ParameterizedHttpServerTest // SPR-17506
public void personResponseBodyWithEmptyMono(HttpServer httpServer) throws Exception { void personResponseBodyWithEmptyMono(HttpServer httpServer) throws Exception {
startServer(httpServer); startServer(httpServer);
ResponseEntity<Person> responseEntity = performGet("/person-response/mono-empty", JSON, Person.class); ResponseEntity<Person> responseEntity = performGet("/person-response/mono-empty", JSON, Person.class);
@ -174,7 +171,7 @@ public class RequestMappingMessageConversionIntegrationTests extends AbstractReq
} }
@ParameterizedHttpServerTest @ParameterizedHttpServerTest
public void personResponseBodyWithMonoDeclaredAsObject(HttpServer httpServer) throws Exception { void personResponseBodyWithMonoDeclaredAsObject(HttpServer httpServer) throws Exception {
startServer(httpServer); startServer(httpServer);
Person expected = new Person("Robert"); Person expected = new Person("Robert");
@ -184,7 +181,7 @@ public class RequestMappingMessageConversionIntegrationTests extends AbstractReq
} }
@ParameterizedHttpServerTest @ParameterizedHttpServerTest
public void personResponseBodyWithSingle(HttpServer httpServer) throws Exception { void personResponseBodyWithSingle(HttpServer httpServer) throws Exception {
startServer(httpServer); startServer(httpServer);
Person expected = new Person("Robert"); Person expected = new Person("Robert");
@ -194,7 +191,7 @@ public class RequestMappingMessageConversionIntegrationTests extends AbstractReq
} }
@ParameterizedHttpServerTest @ParameterizedHttpServerTest
public void personResponseBodyWithMonoResponseEntity(HttpServer httpServer) throws Exception { void personResponseBodyWithMonoResponseEntity(HttpServer httpServer) throws Exception {
startServer(httpServer); startServer(httpServer);
Person expected = new Person("Robert"); Person expected = new Person("Robert");
@ -204,7 +201,7 @@ public class RequestMappingMessageConversionIntegrationTests extends AbstractReq
} }
@ParameterizedHttpServerTest // SPR-16172 @ParameterizedHttpServerTest // SPR-16172
public void personResponseBodyWithMonoResponseEntityXml(HttpServer httpServer) throws Exception { void personResponseBodyWithMonoResponseEntityXml(HttpServer httpServer) throws Exception {
startServer(httpServer); startServer(httpServer);
@ -218,7 +215,7 @@ public class RequestMappingMessageConversionIntegrationTests extends AbstractReq
} }
@ParameterizedHttpServerTest @ParameterizedHttpServerTest
public void personResponseBodyWithList(HttpServer httpServer) throws Exception { void personResponseBodyWithList(HttpServer httpServer) throws Exception {
startServer(httpServer); startServer(httpServer);
List<?> expected = asList(new Person("Robert"), new Person("Marie")); List<?> expected = asList(new Person("Robert"), new Person("Marie"));
@ -228,7 +225,7 @@ public class RequestMappingMessageConversionIntegrationTests extends AbstractReq
} }
@ParameterizedHttpServerTest @ParameterizedHttpServerTest
public void personResponseBodyWithPublisher(HttpServer httpServer) throws Exception { void personResponseBodyWithPublisher(HttpServer httpServer) throws Exception {
startServer(httpServer); startServer(httpServer);
List<?> expected = asList(new Person("Robert"), new Person("Marie")); List<?> expected = asList(new Person("Robert"), new Person("Marie"));
@ -238,7 +235,7 @@ public class RequestMappingMessageConversionIntegrationTests extends AbstractReq
} }
@ParameterizedHttpServerTest @ParameterizedHttpServerTest
public void personResponseBodyWithFlux(HttpServer httpServer) throws Exception { void personResponseBodyWithFlux(HttpServer httpServer) throws Exception {
startServer(httpServer); startServer(httpServer);
List<?> expected = asList(new Person("Robert"), new Person("Marie")); List<?> expected = asList(new Person("Robert"), new Person("Marie"));
@ -246,7 +243,7 @@ public class RequestMappingMessageConversionIntegrationTests extends AbstractReq
} }
@ParameterizedHttpServerTest @ParameterizedHttpServerTest
public void personResponseBodyWithObservable(HttpServer httpServer) throws Exception { void personResponseBodyWithObservable(HttpServer httpServer) throws Exception {
startServer(httpServer); startServer(httpServer);
List<?> expected = asList(new Person("Robert"), new Person("Marie")); List<?> expected = asList(new Person("Robert"), new Person("Marie"));
@ -254,7 +251,7 @@ public class RequestMappingMessageConversionIntegrationTests extends AbstractReq
} }
@ParameterizedHttpServerTest @ParameterizedHttpServerTest
public void resource(HttpServer httpServer) throws Exception { void resource(HttpServer httpServer) throws Exception {
startServer(httpServer); startServer(httpServer);
ResponseEntity<byte[]> response = performGet("/resource", new HttpHeaders(), byte[].class); ResponseEntity<byte[]> response = performGet("/resource", new HttpHeaders(), byte[].class);
@ -267,7 +264,7 @@ public class RequestMappingMessageConversionIntegrationTests extends AbstractReq
} }
@ParameterizedHttpServerTest @ParameterizedHttpServerTest
public void personTransform(HttpServer httpServer) throws Exception { void personTransform(HttpServer httpServer) throws Exception {
startServer(httpServer); startServer(httpServer);
assertThat(performPost("/person-transform/person", JSON, new Person("Robert"), assertThat(performPost("/person-transform/person", JSON, new Person("Robert"),
@ -275,7 +272,7 @@ public class RequestMappingMessageConversionIntegrationTests extends AbstractReq
} }
@ParameterizedHttpServerTest @ParameterizedHttpServerTest
public void personTransformWithCompletableFuture(HttpServer httpServer) throws Exception { void personTransformWithCompletableFuture(HttpServer httpServer) throws Exception {
startServer(httpServer); startServer(httpServer);
assertThat(performPost("/person-transform/completable-future", JSON, new Person("Robert"), assertThat(performPost("/person-transform/completable-future", JSON, new Person("Robert"),
@ -283,7 +280,7 @@ public class RequestMappingMessageConversionIntegrationTests extends AbstractReq
} }
@ParameterizedHttpServerTest @ParameterizedHttpServerTest
public void personTransformWithMono(HttpServer httpServer) throws Exception { void personTransformWithMono(HttpServer httpServer) throws Exception {
startServer(httpServer); startServer(httpServer);
assertThat(performPost("/person-transform/mono", JSON, new Person("Robert"), assertThat(performPost("/person-transform/mono", JSON, new Person("Robert"),
@ -291,7 +288,7 @@ public class RequestMappingMessageConversionIntegrationTests extends AbstractReq
} }
@ParameterizedHttpServerTest // SPR-16759 @ParameterizedHttpServerTest // SPR-16759
public void personTransformWithMonoAndXml(HttpServer httpServer) throws Exception { void personTransformWithMonoAndXml(HttpServer httpServer) throws Exception {
startServer(httpServer); startServer(httpServer);
assertThat(performPost("/person-transform/mono", MediaType.APPLICATION_XML, new Person("Robert"), assertThat(performPost("/person-transform/mono", MediaType.APPLICATION_XML, new Person("Robert"),
@ -299,7 +296,7 @@ public class RequestMappingMessageConversionIntegrationTests extends AbstractReq
} }
@ParameterizedHttpServerTest @ParameterizedHttpServerTest
public void personTransformWithSingle(HttpServer httpServer) throws Exception { void personTransformWithSingle(HttpServer httpServer) throws Exception {
startServer(httpServer); startServer(httpServer);
assertThat(performPost("/person-transform/single", JSON, new Person("Robert"), assertThat(performPost("/person-transform/single", JSON, new Person("Robert"),
@ -307,7 +304,7 @@ public class RequestMappingMessageConversionIntegrationTests extends AbstractReq
} }
@ParameterizedHttpServerTest @ParameterizedHttpServerTest
public void personTransformWithMaybe(HttpServer httpServer) throws Exception { void personTransformWithMaybe(HttpServer httpServer) throws Exception {
startServer(httpServer); startServer(httpServer);
assertThat(performPost("/person-transform/maybe", JSON, new Person("Robert"), assertThat(performPost("/person-transform/maybe", JSON, new Person("Robert"),
@ -315,7 +312,7 @@ public class RequestMappingMessageConversionIntegrationTests extends AbstractReq
} }
@ParameterizedHttpServerTest @ParameterizedHttpServerTest
public void personTransformWithPublisher(HttpServer httpServer) throws Exception { void personTransformWithPublisher(HttpServer httpServer) throws Exception {
startServer(httpServer); startServer(httpServer);
List<?> req = asList(new Person("Robert"), new Person("Marie")); List<?> req = asList(new Person("Robert"), new Person("Marie"));
@ -324,7 +321,7 @@ public class RequestMappingMessageConversionIntegrationTests extends AbstractReq
} }
@ParameterizedHttpServerTest @ParameterizedHttpServerTest
public void personTransformWithFlux(HttpServer httpServer) throws Exception { void personTransformWithFlux(HttpServer httpServer) throws Exception {
startServer(httpServer); startServer(httpServer);
List<?> req = asList(new Person("Robert"), new Person("Marie")); List<?> req = asList(new Person("Robert"), new Person("Marie"));
@ -333,7 +330,7 @@ public class RequestMappingMessageConversionIntegrationTests extends AbstractReq
} }
@ParameterizedHttpServerTest @ParameterizedHttpServerTest
public void personTransformWithObservable(HttpServer httpServer) throws Exception { void personTransformWithObservable(HttpServer httpServer) throws Exception {
startServer(httpServer); startServer(httpServer);
List<?> req = asList(new Person("Robert"), new Person("Marie")); List<?> req = asList(new Person("Robert"), new Person("Marie"));
@ -342,7 +339,7 @@ public class RequestMappingMessageConversionIntegrationTests extends AbstractReq
} }
@ParameterizedHttpServerTest @ParameterizedHttpServerTest
public void personTransformWithFlowable(HttpServer httpServer) throws Exception { void personTransformWithFlowable(HttpServer httpServer) throws Exception {
startServer(httpServer); startServer(httpServer);
List<?> req = asList(new Person("Robert"), new Person("Marie")); List<?> req = asList(new Person("Robert"), new Person("Marie"));
@ -351,7 +348,7 @@ public class RequestMappingMessageConversionIntegrationTests extends AbstractReq
} }
@ParameterizedHttpServerTest @ParameterizedHttpServerTest
public void personCreateWithPublisherJson(HttpServer httpServer) throws Exception { void personCreateWithPublisherJson(HttpServer httpServer) throws Exception {
startServer(httpServer); startServer(httpServer);
ResponseEntity<Void> entity = performPost("/person-create/publisher", JSON, ResponseEntity<Void> entity = performPost("/person-create/publisher", JSON,
@ -362,7 +359,7 @@ public class RequestMappingMessageConversionIntegrationTests extends AbstractReq
} }
@ParameterizedHttpServerTest @ParameterizedHttpServerTest
public void personCreateWithPublisherXml(HttpServer httpServer) throws Exception { void personCreateWithPublisherXml(HttpServer httpServer) throws Exception {
startServer(httpServer); startServer(httpServer);
People people = new People(new Person("Robert"), new Person("Marie")); People people = new People(new Person("Robert"), new Person("Marie"));
@ -373,7 +370,7 @@ public class RequestMappingMessageConversionIntegrationTests extends AbstractReq
} }
@ParameterizedHttpServerTest @ParameterizedHttpServerTest
public void personCreateWithMono(HttpServer httpServer) throws Exception { void personCreateWithMono(HttpServer httpServer) throws Exception {
startServer(httpServer); startServer(httpServer);
ResponseEntity<Void> entity = performPost( ResponseEntity<Void> entity = performPost(
@ -384,7 +381,7 @@ public class RequestMappingMessageConversionIntegrationTests extends AbstractReq
} }
@ParameterizedHttpServerTest @ParameterizedHttpServerTest
public void personCreateWithSingle(HttpServer httpServer) throws Exception { void personCreateWithSingle(HttpServer httpServer) throws Exception {
startServer(httpServer); startServer(httpServer);
ResponseEntity<Void> entity = performPost( ResponseEntity<Void> entity = performPost(
@ -395,7 +392,7 @@ public class RequestMappingMessageConversionIntegrationTests extends AbstractReq
} }
@ParameterizedHttpServerTest @ParameterizedHttpServerTest
public void personCreateWithFluxJson(HttpServer httpServer) throws Exception { void personCreateWithFluxJson(HttpServer httpServer) throws Exception {
startServer(httpServer); startServer(httpServer);
ResponseEntity<Void> entity = performPost("/person-create/flux", JSON, ResponseEntity<Void> entity = performPost("/person-create/flux", JSON,
@ -406,7 +403,7 @@ public class RequestMappingMessageConversionIntegrationTests extends AbstractReq
} }
@ParameterizedHttpServerTest @ParameterizedHttpServerTest
public void personCreateWithFluxXml(HttpServer httpServer) throws Exception { void personCreateWithFluxXml(HttpServer httpServer) throws Exception {
startServer(httpServer); startServer(httpServer);
People people = new People(new Person("Robert"), new Person("Marie")); People people = new People(new Person("Robert"), new Person("Marie"));
@ -417,7 +414,7 @@ public class RequestMappingMessageConversionIntegrationTests extends AbstractReq
} }
@ParameterizedHttpServerTest @ParameterizedHttpServerTest
public void personCreateWithObservableJson(HttpServer httpServer) throws Exception { void personCreateWithObservableJson(HttpServer httpServer) throws Exception {
startServer(httpServer); startServer(httpServer);
ResponseEntity<Void> entity = performPost("/person-create/observable", JSON, ResponseEntity<Void> entity = performPost("/person-create/observable", JSON,
@ -428,7 +425,7 @@ public class RequestMappingMessageConversionIntegrationTests extends AbstractReq
} }
@ParameterizedHttpServerTest @ParameterizedHttpServerTest
public void personCreateWithObservableXml(HttpServer httpServer) throws Exception { void personCreateWithObservableXml(HttpServer httpServer) throws Exception {
startServer(httpServer); startServer(httpServer);
People people = new People(new Person("Robert"), new Person("Marie")); People people = new People(new Person("Robert"), new Person("Marie"));
@ -439,7 +436,7 @@ public class RequestMappingMessageConversionIntegrationTests extends AbstractReq
} }
@ParameterizedHttpServerTest @ParameterizedHttpServerTest
public void personCreateWithFlowableJson(HttpServer httpServer) throws Exception { void personCreateWithFlowableJson(HttpServer httpServer) throws Exception {
startServer(httpServer); startServer(httpServer);
ResponseEntity<Void> entity = performPost("/person-create/flowable", JSON, ResponseEntity<Void> entity = performPost("/person-create/flowable", JSON,
@ -450,7 +447,7 @@ public class RequestMappingMessageConversionIntegrationTests extends AbstractReq
} }
@ParameterizedHttpServerTest @ParameterizedHttpServerTest
public void personCreateWithFlowableXml(HttpServer httpServer) throws Exception { void personCreateWithFlowableXml(HttpServer httpServer) throws Exception {
startServer(httpServer); startServer(httpServer);
People people = new People(new Person("Robert"), new Person("Marie")); People people = new People(new Person("Robert"), new Person("Marie"));
@ -461,7 +458,7 @@ public class RequestMappingMessageConversionIntegrationTests extends AbstractReq
} }
@ParameterizedHttpServerTest // gh-23791 @ParameterizedHttpServerTest // gh-23791
public void personCreateViaDefaultMethodWithGenerics(HttpServer httpServer) throws Exception { void personCreateViaDefaultMethodWithGenerics(HttpServer httpServer) throws Exception {
startServer(httpServer); startServer(httpServer);
ResponseEntity<String> entity = performPost("/23791", JSON, new Person("Robert"), null, String.class); ResponseEntity<String> entity = performPost("/23791", JSON, new Person("Robert"), null, String.class);
@ -484,29 +481,30 @@ public class RequestMappingMessageConversionIntegrationTests extends AbstractReq
private static class RawResponseBodyController { private static class RawResponseBodyController {
@GetMapping("/publisher") @GetMapping("/publisher")
public Publisher<ByteBuffer> getPublisher() { @SuppressWarnings("deprecation")
Publisher<ByteBuffer> getPublisher() {
Jackson2JsonEncoder encoder = new Jackson2JsonEncoder(); Jackson2JsonEncoder encoder = new Jackson2JsonEncoder();
return encoder.encode(Mono.just(new Person("Robert")), DefaultDataBufferFactory.sharedInstance, return encoder.encode(Mono.just(new Person("Robert")), DefaultDataBufferFactory.sharedInstance,
ResolvableType.forClass(Person.class), JSON, Collections.emptyMap()).map(DataBuffer::toByteBuffer); ResolvableType.forClass(Person.class), JSON, Collections.emptyMap()).map(DataBuffer::toByteBuffer);
} }
@GetMapping("/flux") @GetMapping("/flux")
public Flux<ByteBuffer> getFlux() { Flux<ByteBuffer> getFlux() {
return Flux.just(ByteBuffer.wrap("Hello!".getBytes())); return Flux.just(ByteBuffer.wrap("Hello!".getBytes()));
} }
@GetMapping("/mono") @GetMapping("/mono")
public Mono<ByteBuffer> getMonoString() { Mono<ByteBuffer> getMonoString() {
return Mono.just(ByteBuffer.wrap("Hello!".getBytes())); return Mono.just(ByteBuffer.wrap("Hello!".getBytes()));
} }
@GetMapping("/observable") @GetMapping("/observable")
public Observable<ByteBuffer> getObservable() { Observable<ByteBuffer> getObservable() {
return Observable.just(ByteBuffer.wrap("Hello!".getBytes())); return Observable.just(ByteBuffer.wrap("Hello!".getBytes()));
} }
@GetMapping("/flowable") @GetMapping("/flowable")
public Flowable<ByteBuffer> getFlowable() { Flowable<ByteBuffer> getFlowable() {
return Flowable.just(ByteBuffer.wrap("Hello!".getBytes())); return Flowable.just(ByteBuffer.wrap("Hello!".getBytes()));
} }
} }
@ -518,64 +516,64 @@ public class RequestMappingMessageConversionIntegrationTests extends AbstractReq
private static class PersonResponseBodyController { private static class PersonResponseBodyController {
@GetMapping("/person") @GetMapping("/person")
public Person getPerson() { Person getPerson() {
return new Person("Robert"); return new Person("Robert");
} }
@GetMapping("/completable-future") @GetMapping("/completable-future")
public CompletableFuture<Person> getCompletableFuture() { CompletableFuture<Person> getCompletableFuture() {
return CompletableFuture.completedFuture(new Person("Robert")); return CompletableFuture.completedFuture(new Person("Robert"));
} }
@GetMapping("/mono") @GetMapping("/mono")
public Mono<Person> getMono() { Mono<Person> getMono() {
return Mono.just(new Person("Robert")); return Mono.just(new Person("Robert"));
} }
@GetMapping("/mono-empty") @GetMapping("/mono-empty")
public Mono<Person> getMonoEmpty() { Mono<Person> getMonoEmpty() {
return Mono.empty(); return Mono.empty();
} }
@GetMapping("/mono-declared-as-object") @GetMapping("/mono-declared-as-object")
public Object getMonoDeclaredAsObject() { Object getMonoDeclaredAsObject() {
return Mono.just(new Person("Robert")); return Mono.just(new Person("Robert"));
} }
@GetMapping("/single") @GetMapping("/single")
public Single<Person> getSingle() { Single<Person> getSingle() {
return Single.just(new Person("Robert")); return Single.just(new Person("Robert"));
} }
@GetMapping("/mono-response-entity") @GetMapping("/mono-response-entity")
public ResponseEntity<Mono<Person>> getMonoResponseEntity() { ResponseEntity<Mono<Person>> getMonoResponseEntity() {
Mono<Person> body = Mono.just(new Person("Robert")); Mono<Person> body = Mono.just(new Person("Robert"));
return ResponseEntity.ok(body); return ResponseEntity.ok(body);
} }
@GetMapping("/mono-response-entity-xml") @GetMapping("/mono-response-entity-xml")
public ResponseEntity<Mono<Person>> getMonoResponseEntityXml() { ResponseEntity<Mono<Person>> getMonoResponseEntityXml() {
Mono<Person> body = Mono.just(new Person("Robert")); Mono<Person> body = Mono.just(new Person("Robert"));
return ResponseEntity.ok().contentType(MediaType.APPLICATION_XML).body(body); return ResponseEntity.ok().contentType(MediaType.APPLICATION_XML).body(body);
} }
@GetMapping("/list") @GetMapping("/list")
public List<Person> getList() { List<Person> getList() {
return asList(new Person("Robert"), new Person("Marie")); return asList(new Person("Robert"), new Person("Marie"));
} }
@GetMapping("/publisher") @GetMapping("/publisher")
public Publisher<Person> getPublisher() { Publisher<Person> getPublisher() {
return Flux.just(new Person("Robert"), new Person("Marie")); return Flux.just(new Person("Robert"), new Person("Marie"));
} }
@GetMapping("/flux") @GetMapping("/flux")
public Flux<Person> getFlux() { Flux<Person> getFlux() {
return Flux.just(new Person("Robert"), new Person("Marie")); return Flux.just(new Person("Robert"), new Person("Marie"));
} }
@GetMapping("/observable") @GetMapping("/observable")
public Observable<Person> getObservable() { Observable<Person> getObservable() {
return Observable.just(new Person("Robert"), new Person("Marie")); return Observable.just(new Person("Robert"), new Person("Marie"));
} }
} }
@ -586,7 +584,7 @@ public class RequestMappingMessageConversionIntegrationTests extends AbstractReq
private static class ResourceController { private static class ResourceController {
@GetMapping("/resource") @GetMapping("/resource")
public Resource resource() { Resource resource() {
return new ClassPathResource("/org/springframework/web/reactive/spring.png"); return new ClassPathResource("/org/springframework/web/reactive/spring.png");
} }
} }
@ -598,47 +596,47 @@ public class RequestMappingMessageConversionIntegrationTests extends AbstractReq
private static class PersonTransformationController { private static class PersonTransformationController {
@PostMapping("/person") @PostMapping("/person")
public Person transformPerson(@RequestBody Person person) { Person transformPerson(@RequestBody Person person) {
return new Person(person.getName().toUpperCase()); return new Person(person.getName().toUpperCase());
} }
@PostMapping("/completable-future") @PostMapping("/completable-future")
public CompletableFuture<Person> transformCompletableFuture(@RequestBody CompletableFuture<Person> future) { CompletableFuture<Person> transformCompletableFuture(@RequestBody CompletableFuture<Person> future) {
return future.thenApply(person -> new Person(person.getName().toUpperCase())); return future.thenApply(person -> new Person(person.getName().toUpperCase()));
} }
@PostMapping("/mono") @PostMapping("/mono")
public Mono<Person> transformMono(@RequestBody Mono<Person> personFuture) { Mono<Person> transformMono(@RequestBody Mono<Person> personFuture) {
return personFuture.map(person -> new Person(person.getName().toUpperCase())); return personFuture.map(person -> new Person(person.getName().toUpperCase()));
} }
@PostMapping("/single") @PostMapping("/single")
public Single<Person> transformSingle(@RequestBody Single<Person> personFuture) { Single<Person> transformSingle(@RequestBody Single<Person> personFuture) {
return personFuture.map(person -> new Person(person.getName().toUpperCase())); return personFuture.map(person -> new Person(person.getName().toUpperCase()));
} }
@PostMapping("/maybe") @PostMapping("/maybe")
public Maybe<Person> transformMaybe(@RequestBody Maybe<Person> personFuture) { Maybe<Person> transformMaybe(@RequestBody Maybe<Person> personFuture) {
return personFuture.map(person -> new Person(person.getName().toUpperCase())); return personFuture.map(person -> new Person(person.getName().toUpperCase()));
} }
@PostMapping("/publisher") @PostMapping("/publisher")
public Publisher<Person> transformPublisher(@RequestBody Publisher<Person> persons) { Publisher<Person> transformPublisher(@RequestBody Publisher<Person> persons) {
return Flux.from(persons).map(person -> new Person(person.getName().toUpperCase())); return Flux.from(persons).map(person -> new Person(person.getName().toUpperCase()));
} }
@PostMapping("/flux") @PostMapping("/flux")
public Flux<Person> transformFlux(@RequestBody Flux<Person> persons) { Flux<Person> transformFlux(@RequestBody Flux<Person> persons) {
return persons.map(person -> new Person(person.getName().toUpperCase())); return persons.map(person -> new Person(person.getName().toUpperCase()));
} }
@PostMapping("/observable") @PostMapping("/observable")
public Observable<Person> transformObservable(@RequestBody Observable<Person> persons) { Observable<Person> transformObservable(@RequestBody Observable<Person> persons) {
return persons.map(person -> new Person(person.getName().toUpperCase())); return persons.map(person -> new Person(person.getName().toUpperCase()));
} }
@PostMapping("/flowable") @PostMapping("/flowable")
public Flowable<Person> transformFlowable(@RequestBody Flowable<Person> persons) { Flowable<Person> transformFlowable(@RequestBody Flowable<Person> persons) {
return persons.map(person -> new Person(person.getName().toUpperCase())); return persons.map(person -> new Person(person.getName().toUpperCase()));
} }
} }
@ -652,32 +650,32 @@ public class RequestMappingMessageConversionIntegrationTests extends AbstractReq
final List<Person> persons = new ArrayList<>(); final List<Person> persons = new ArrayList<>();
@PostMapping("/publisher") @PostMapping("/publisher")
public Publisher<Void> createWithPublisher(@RequestBody Publisher<Person> publisher) { Publisher<Void> createWithPublisher(@RequestBody Publisher<Person> publisher) {
return Flux.from(publisher).doOnNext(persons::add).then(); return Flux.from(publisher).doOnNext(persons::add).then();
} }
@PostMapping("/mono") @PostMapping("/mono")
public Mono<Void> createWithMono(@RequestBody Mono<Person> mono) { Mono<Void> createWithMono(@RequestBody Mono<Person> mono) {
return mono.doOnNext(persons::add).then(); return mono.doOnNext(persons::add).then();
} }
@PostMapping("/single") @PostMapping("/single")
public Completable createWithSingle(@RequestBody Single<Person> single) { Completable createWithSingle(@RequestBody Single<Person> single) {
return single.map(persons::add).ignoreElement(); return single.map(persons::add).ignoreElement();
} }
@PostMapping("/flux") @PostMapping("/flux")
public Mono<Void> createWithFlux(@RequestBody Flux<Person> flux) { Mono<Void> createWithFlux(@RequestBody Flux<Person> flux) {
return flux.doOnNext(persons::add).then(); return flux.doOnNext(persons::add).then();
} }
@PostMapping("/observable") @PostMapping("/observable")
public Completable createWithObservable(@RequestBody Observable<Person> observable) { Completable createWithObservable(@RequestBody Observable<Person> observable) {
return observable.toList().doOnSuccess(persons::addAll).ignoreElement(); return observable.toList().doOnSuccess(persons::addAll).ignoreElement();
} }
@PostMapping("/flowable") @PostMapping("/flowable")
public Completable createWithFlowable(@RequestBody Flowable<Person> flowable) { Completable createWithFlowable(@RequestBody Flowable<Person> flowable) {
return flowable.toList().doOnSuccess(persons::addAll).ignoreElement(); return flowable.toList().doOnSuccess(persons::addAll).ignoreElement();
} }
} }

55
spring-webflux/src/test/java/org/springframework/web/reactive/result/view/freemarker/FreeMarkerViewTests.java

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2022 the original author or authors. * Copyright 2002-2023 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -48,12 +48,14 @@ import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException
* @author Rossen Stoyanchev * @author Rossen Stoyanchev
* @author Sam Brannen * @author Sam Brannen
*/ */
public class FreeMarkerViewTests { class FreeMarkerViewTests {
private static final String TEMPLATE_PATH = private static final String TEMPLATE_PATH =
"classpath*:org/springframework/web/reactive/view/freemarker/"; "classpath*:org/springframework/web/reactive/view/freemarker/";
private final FreeMarkerView freeMarkerView = new FreeMarkerView();
private final MockServerWebExchange exchange = private final MockServerWebExchange exchange =
MockServerWebExchange.from(MockServerHttpRequest.get("/path")); MockServerWebExchange.from(MockServerHttpRequest.get("/path"));
@ -63,7 +65,7 @@ public class FreeMarkerViewTests {
@BeforeEach @BeforeEach
public void setup() throws Exception { void setup() throws Exception {
this.context.refresh(); this.context.refresh();
FreeMarkerConfigurer configurer = new FreeMarkerConfigurer(); FreeMarkerConfigurer configurer = new FreeMarkerConfigurer();
@ -75,42 +77,39 @@ public class FreeMarkerViewTests {
@Test @Test
public void noFreeMarkerConfig() throws Exception { void noFreeMarkerConfig() {
FreeMarkerView view = new FreeMarkerView(); freeMarkerView.setApplicationContext(this.context);
view.setApplicationContext(this.context); freeMarkerView.setUrl("anythingButNull");
view.setUrl("anythingButNull");
assertThatExceptionOfType(ApplicationContextException.class) assertThatExceptionOfType(ApplicationContextException.class)
.isThrownBy(view::afterPropertiesSet) .isThrownBy(freeMarkerView::afterPropertiesSet)
.withMessageContaining("Must define a single FreeMarkerConfig bean"); .withMessageContaining("Must define a single FreeMarkerConfig bean");
} }
@Test @Test
public void noTemplateName() throws Exception { void noTemplateName() {
FreeMarkerView freeMarkerView = new FreeMarkerView();
assertThatIllegalArgumentException() assertThatIllegalArgumentException()
.isThrownBy(freeMarkerView::afterPropertiesSet) .isThrownBy(freeMarkerView::afterPropertiesSet)
.withMessageContaining("Property 'url' is required"); .withMessageContaining("Property 'url' is required");
} }
@Test @Test
public void checkResourceExists() throws Exception { void checkResourceExists() throws Exception {
FreeMarkerView view = new FreeMarkerView(); freeMarkerView.setConfiguration(this.freeMarkerConfig);
view.setConfiguration(this.freeMarkerConfig); freeMarkerView.setUrl("test.ftl");
view.setUrl("test.ftl");
assertThat(view.checkResourceExists(Locale.US)).isTrue(); assertThat(freeMarkerView.checkResourceExists(Locale.US)).isTrue();
} }
@Test @Test
public void render() { void render() {
FreeMarkerView view = new FreeMarkerView(); freeMarkerView.setApplicationContext(this.context);
view.setApplicationContext(this.context); freeMarkerView.setConfiguration(this.freeMarkerConfig);
view.setConfiguration(this.freeMarkerConfig); freeMarkerView.setUrl("test.ftl");
view.setUrl("test.ftl");
ModelMap model = new ExtendedModelMap(); ModelMap model = new ExtendedModelMap();
model.addAttribute("hello", "hi FreeMarker"); model.addAttribute("hello", "hi FreeMarker");
view.render(model, null, this.exchange).block(Duration.ofMillis(5000)); freeMarkerView.render(model, null, this.exchange).block(Duration.ofMillis(5000));
StepVerifier.create(this.exchange.getResponse().getBody()) StepVerifier.create(this.exchange.getResponse().getBody())
.consumeNextWith(buf -> assertThat(asString(buf)).isEqualTo("<html><body>hi FreeMarker</body></html>")) .consumeNextWith(buf -> assertThat(asString(buf)).isEqualTo("<html><body>hi FreeMarker</body></html>"))
@ -119,21 +118,20 @@ public class FreeMarkerViewTests {
} }
@Test // gh-22754 @Test // gh-22754
public void subscribeWithoutDemand() { void subscribeWithoutDemand() {
ZeroDemandResponse response = new ZeroDemandResponse(); ZeroDemandResponse response = new ZeroDemandResponse();
ServerWebExchange exchange = new DefaultServerWebExchange( ServerWebExchange exchange = new DefaultServerWebExchange(
MockServerHttpRequest.get("/path").build(), response, MockServerHttpRequest.get("/path").build(), response,
new DefaultWebSessionManager(), ServerCodecConfigurer.create(), new DefaultWebSessionManager(), ServerCodecConfigurer.create(),
new AcceptHeaderLocaleContextResolver()); new AcceptHeaderLocaleContextResolver());
FreeMarkerView view = new FreeMarkerView(); freeMarkerView.setApplicationContext(this.context);
view.setApplicationContext(this.context); freeMarkerView.setConfiguration(this.freeMarkerConfig);
view.setConfiguration(this.freeMarkerConfig); freeMarkerView.setUrl("test.ftl");
view.setUrl("test.ftl");
ModelMap model = new ExtendedModelMap(); ModelMap model = new ExtendedModelMap();
model.addAttribute("hello", "hi FreeMarker"); model.addAttribute("hello", "hi FreeMarker");
view.render(model, null, exchange).subscribe(); freeMarkerView.render(model, null, exchange).subscribe();
response.cancelWrite(); response.cancelWrite();
response.checkForLeaks(); response.checkForLeaks();
@ -141,8 +139,9 @@ public class FreeMarkerViewTests {
private static String asString(DataBuffer dataBuffer) { private static String asString(DataBuffer dataBuffer) {
@SuppressWarnings("deprecation")
ByteBuffer byteBuffer = dataBuffer.toByteBuffer(); ByteBuffer byteBuffer = dataBuffer.toByteBuffer();
final byte[] bytes = new byte[byteBuffer.remaining()]; byte[] bytes = new byte[byteBuffer.remaining()];
byteBuffer.get(bytes); byteBuffer.get(bytes);
return new String(bytes, StandardCharsets.UTF_8); return new String(bytes, StandardCharsets.UTF_8);
} }

97
spring-webmvc/src/test/java/org/springframework/web/servlet/view/freemarker/FreeMarkerViewTests.java

@ -47,6 +47,7 @@ import org.springframework.web.testfixture.servlet.MockServletContext;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatExceptionOfType; import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
import static org.assertj.core.api.InstanceOfAssertFactories.type;
import static org.mockito.BDDMockito.given; import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
@ -55,36 +56,36 @@ import static org.mockito.Mockito.mock;
* @author Sam Brannen * @author Sam Brannen
* @since 14.03.2004 * @since 14.03.2004
*/ */
public class FreeMarkerViewTests { class FreeMarkerViewTests {
@Test private static final String TEMPLATE_NAME = "templateName";
public void noFreeMarkerConfig() throws Exception {
FreeMarkerView fv = new FreeMarkerView();
private final FreeMarkerView freeMarkerView = new FreeMarkerView();
@Test
void noFreeMarkerConfig() {
WebApplicationContext wac = mock(); WebApplicationContext wac = mock();
given(wac.getBeansOfType(FreeMarkerConfig.class, true, false)).willReturn(new HashMap<>()); given(wac.getBeansOfType(FreeMarkerConfig.class, true, false)).willReturn(new HashMap<>());
given(wac.getServletContext()).willReturn(new MockServletContext()); given(wac.getServletContext()).willReturn(new MockServletContext());
fv.setUrl("anythingButNull"); freeMarkerView.setUrl("anythingButNull");
assertThatExceptionOfType(ApplicationContextException.class).isThrownBy(() -> assertThatExceptionOfType(ApplicationContextException.class)
fv.setApplicationContext(wac)) .isThrownBy(() -> freeMarkerView.setApplicationContext(wac))
.withMessageContaining("FreeMarkerConfig"); .withMessageContaining("Must define a single FreeMarkerConfig bean");
} }
@Test @Test
public void noTemplateName() throws Exception { void noTemplateName() {
FreeMarkerView fv = new FreeMarkerView(); assertThatIllegalArgumentException()
.isThrownBy(freeMarkerView::afterPropertiesSet)
assertThatIllegalArgumentException().isThrownBy(() -> .withMessageContaining("Property 'url' is required");
fv.afterPropertiesSet())
.withMessageContaining("url");
} }
@Test @Test
public void validTemplateName() throws Exception { void validTemplateName() throws Exception {
FreeMarkerView fv = new FreeMarkerView();
WebApplicationContext wac = mock(); WebApplicationContext wac = mock();
MockServletContext sc = new MockServletContext(); MockServletContext sc = new MockServletContext();
@ -95,8 +96,8 @@ public class FreeMarkerViewTests {
given(wac.getBeansOfType(FreeMarkerConfig.class, true, false)).willReturn(configs); given(wac.getBeansOfType(FreeMarkerConfig.class, true, false)).willReturn(configs);
given(wac.getServletContext()).willReturn(sc); given(wac.getServletContext()).willReturn(sc);
fv.setUrl("templateName"); freeMarkerView.setUrl(TEMPLATE_NAME);
fv.setApplicationContext(wac); freeMarkerView.setApplicationContext(wac);
MockHttpServletRequest request = new MockHttpServletRequest(); MockHttpServletRequest request = new MockHttpServletRequest();
request.addPreferredLocale(Locale.US); request.addPreferredLocale(Locale.US);
@ -104,17 +105,14 @@ public class FreeMarkerViewTests {
request.setAttribute(DispatcherServlet.LOCALE_RESOLVER_ATTRIBUTE, new AcceptHeaderLocaleResolver()); request.setAttribute(DispatcherServlet.LOCALE_RESOLVER_ATTRIBUTE, new AcceptHeaderLocaleResolver());
HttpServletResponse response = new MockHttpServletResponse(); HttpServletResponse response = new MockHttpServletResponse();
Map<String, Object> model = new HashMap<>(); Map<String, Object> model = Map.of("myattr", "myvalue");
model.put("myattr", "myvalue"); freeMarkerView.render(model, request, response);
fv.render(model, request, response);
assertThat(response.getContentType()).isEqualTo(AbstractView.DEFAULT_CONTENT_TYPE); assertThat(response.getContentType()).isEqualTo(AbstractView.DEFAULT_CONTENT_TYPE);
} }
@Test @Test
public void keepExistingContentType() throws Exception { void keepExistingContentType() throws Exception {
FreeMarkerView fv = new FreeMarkerView();
WebApplicationContext wac = mock(); WebApplicationContext wac = mock();
MockServletContext sc = new MockServletContext(); MockServletContext sc = new MockServletContext();
@ -125,8 +123,8 @@ public class FreeMarkerViewTests {
given(wac.getBeansOfType(FreeMarkerConfig.class, true, false)).willReturn(configs); given(wac.getBeansOfType(FreeMarkerConfig.class, true, false)).willReturn(configs);
given(wac.getServletContext()).willReturn(sc); given(wac.getServletContext()).willReturn(sc);
fv.setUrl("templateName"); freeMarkerView.setUrl(TEMPLATE_NAME);
fv.setApplicationContext(wac); freeMarkerView.setApplicationContext(wac);
MockHttpServletRequest request = new MockHttpServletRequest(); MockHttpServletRequest request = new MockHttpServletRequest();
request.addPreferredLocale(Locale.US); request.addPreferredLocale(Locale.US);
@ -135,17 +133,14 @@ public class FreeMarkerViewTests {
HttpServletResponse response = new MockHttpServletResponse(); HttpServletResponse response = new MockHttpServletResponse();
response.setContentType("myContentType"); response.setContentType("myContentType");
Map<String, Object> model = new HashMap<>(); Map<String, Object> model = Map.of("myattr", "myvalue");
model.put("myattr", "myvalue"); freeMarkerView.render(model, request, response);
fv.render(model, request, response);
assertThat(response.getContentType()).isEqualTo("myContentType"); assertThat(response.getContentType()).isEqualTo("myContentType");
} }
@Test @Test
public void requestAttributeVisible() throws Exception { void requestAttributeVisible() throws Exception {
FreeMarkerView fv = new FreeMarkerView();
WebApplicationContext wac = mock(); WebApplicationContext wac = mock();
MockServletContext sc = new MockServletContext(); MockServletContext sc = new MockServletContext();
@ -156,8 +151,8 @@ public class FreeMarkerViewTests {
given(wac.getBeansOfType(FreeMarkerConfig.class, true, false)).willReturn(configs); given(wac.getBeansOfType(FreeMarkerConfig.class, true, false)).willReturn(configs);
given(wac.getServletContext()).willReturn(sc); given(wac.getServletContext()).willReturn(sc);
fv.setUrl("templateName"); freeMarkerView.setUrl(TEMPLATE_NAME);
fv.setApplicationContext(wac); freeMarkerView.setApplicationContext(wac);
MockHttpServletRequest request = new MockHttpServletRequest(); MockHttpServletRequest request = new MockHttpServletRequest();
request.addPreferredLocale(Locale.US); request.addPreferredLocale(Locale.US);
@ -166,11 +161,11 @@ public class FreeMarkerViewTests {
HttpServletResponse response = new MockHttpServletResponse(); HttpServletResponse response = new MockHttpServletResponse();
request.setAttribute("myattr", "myvalue"); request.setAttribute("myattr", "myvalue");
fv.render(null, request, response); freeMarkerView.render(null, request, response);
} }
@Test @Test
public void freeMarkerViewResolver() throws Exception { void freeMarkerViewResolver() throws Exception {
MockServletContext sc = new MockServletContext(); MockServletContext sc = new MockServletContext();
FreeMarkerConfigurer configurer = new FreeMarkerConfigurer(); FreeMarkerConfigurer configurer = new FreeMarkerConfigurer();
@ -181,23 +176,26 @@ public class FreeMarkerViewTests {
wac.getBeanFactory().registerSingleton("configurer", configurer); wac.getBeanFactory().registerSingleton("configurer", configurer);
wac.refresh(); wac.refresh();
FreeMarkerViewResolver vr = new FreeMarkerViewResolver("prefix_", "_suffix"); FreeMarkerViewResolver vr = new FreeMarkerViewResolver("templates/", ".ftl");
vr.setApplicationContext(wac); vr.setApplicationContext(wac);
View view = vr.resolveViewName("test", Locale.CANADA); View view = vr.resolveViewName("test", Locale.CANADA);
assertThat(view.getClass()).as("Correct view class").isEqualTo(FreeMarkerView.class); assertThat(view).asInstanceOf(type(FreeMarkerView.class))
assertThat(((FreeMarkerView) view).getUrl()).as("Correct URL").isEqualTo("prefix_test_suffix"); .extracting(FreeMarkerView::getUrl)
.isEqualTo("templates/test.ftl");
view = vr.resolveViewName("non-existing", Locale.CANADA); view = vr.resolveViewName("non-existing", Locale.CANADA);
assertThat(view).isNull(); assertThat(view).isNull();
view = vr.resolveViewName("redirect:myUrl", Locale.getDefault()); view = vr.resolveViewName("redirect:myRedirectUrl", Locale.getDefault());
assertThat(view.getClass()).as("Correct view class").isEqualTo(RedirectView.class); assertThat(view).asInstanceOf(type(RedirectView.class))
assertThat(((RedirectView) view).getUrl()).as("Correct URL").isEqualTo("myUrl"); .extracting(RedirectView::getUrl)
.isEqualTo("myRedirectUrl");
view = vr.resolveViewName("forward:myUrl", Locale.getDefault()); view = vr.resolveViewName("forward:myForwardUrl", Locale.getDefault());
assertThat(view.getClass()).as("Correct view class").isEqualTo(InternalResourceView.class); assertThat(view).asInstanceOf(type(InternalResourceView.class))
assertThat(((InternalResourceView) view).getUrl()).as("Correct URL").isEqualTo("myUrl"); .extracting(InternalResourceView::getUrl)
.isEqualTo("myForwardUrl");
} }
@ -209,14 +207,13 @@ public class FreeMarkerViewTests {
@Override @Override
public Template getTemplate(String name, final Locale locale) throws IOException { public Template getTemplate(String name, final Locale locale) throws IOException {
if (name.equals("templateName") || name.equals("prefix_test_suffix")) { if (name.equals(TEMPLATE_NAME) || name.equals("templates/test.ftl")) {
return new Template(name, new StringReader("test"), this) { return new Template(name, new StringReader("test"), this) {
@Override @Override
public void process(Object model, Writer writer) throws TemplateException, IOException { public void process(Object model, Writer writer) throws TemplateException, IOException {
assertThat(locale).isEqualTo(Locale.US); assertThat(locale).isEqualTo(Locale.US);
assertThat(model instanceof SimpleHash).isTrue(); assertThat(model).asInstanceOf(type(SimpleHash.class)).satisfies(
SimpleHash fmModel = (SimpleHash) model; fmModel -> assertThat(fmModel.get("myattr")).asString().isEqualTo("myvalue"));
assertThat(String.valueOf(fmModel.get("myattr"))).isEqualTo("myvalue");
} }
}; };
} }

Loading…
Cancel
Save