From 156237227ca515576dafcf1016c8f5c3b8f915af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Wed, 3 Jul 2024 12:54:38 +0200 Subject: [PATCH] Migrate MockMvc tests to MockMvcTester See gh-41198 --- ...FoundryActuatorAutoConfigurationTests.java | 11 +- ...AuditEventsEndpointDocumentationTests.java | 25 ++- .../BeansEndpointDocumentationTests.java | 10 +- .../CachesEndpointDocumentationTests.java | 34 ++--- ...tionsReportEndpointDocumentationTests.java | 8 +- ...rtiesReportEndpointDocumentationTests.java | 19 +-- ...EnvironmentEndpointDocumentationTests.java | 17 +-- .../FlywayEndpointDocumentationTests.java | 10 +- .../HealthEndpointDocumentationTests.java | 24 ++- ...HeapDumpWebEndpointDocumentationTests.java | 12 +- ...tpExchangesEndpointDocumentationTests.java | 10 +- .../InfoEndpointDocumentationTests.java | 12 +- ...rationGraphEndpointDocumentationTests.java | 21 ++- .../LiquibaseEndpointDocumentationTests.java | 10 +- .../LogFileWebEndpointDocumentationTests.java | 21 ++- .../LoggersEndpointDocumentationTests.java | 63 ++++---- .../MetricsEndpointDocumentationTests.java | 31 ++-- .../MockMvcEndpointDocumentationTests.java | 16 +- ...theusScrapeEndpointDocumentationTests.java | 33 ++-- ...lientScrapeEndpointDocumentationTests.java | 37 ++--- .../QuartzEndpointDocumentationTests.java | 63 +++----- .../SbomEndpointDocumentationTests.java | 17 +-- ...eduledTasksEndpointDocumentationTests.java | 10 +- .../SessionsEndpointDocumentationTests.java | 27 ++-- .../ShutdownEndpointDocumentationTests.java | 10 +- .../StartupEndpointDocumentationTests.java | 20 +-- .../ThreadDumpEndpointDocumentationTests.java | 19 +-- ...trollerEndpointWebMvcIntegrationTests.java | 39 +++-- .../WebMvcEndpointCorsIntegrationTests.java | 143 +++++++++--------- .../WebMvcEndpointIntegrationTests.java | 77 +++++----- ...bMvcObservationAutoConfigurationTests.java | 14 +- ...lWebMvcSecurityAutoConfigurationTests.java | 59 ++++---- .../GraphQlWebMvcAutoConfigurationTests.java | 127 ++++++++-------- .../WelcomePageHandlerMappingTests.java | 91 ++++------- ...ePageNotAcceptableHandlerMappingTests.java | 45 +++--- ...asicErrorControllerDirectMockMvcTests.java | 50 +++--- .../BasicErrorControllerMockMvcTests.java | 73 ++++----- .../DefaultErrorViewIntegrationTests.java | 57 +++---- .../RemoteDevToolsAutoConfigurationTests.java | 38 ++--- .../withspringsecurity/MySecurityTests.java | 12 +- .../hamcrest/MyUserDocumentationTests.java | 14 +- .../withmockmvc/MyUserDocumentationTests.kt | 14 +- .../springmvctests/MyControllerTests.kt | 16 +- .../withmockenvironment/MyMockMvcTests.kt | 21 ++- .../withspringsecurity/MySecurityTests.kt | 11 +- ...AdvancedConfigurationIntegrationTests.java | 14 +- ...DocsAutoConfigurationIntegrationTests.java | 11 +- .../MockMvcSecurityIntegrationTests.java | 28 ++-- ...ecurityFilterOrderingIntegrationTests.java | 14 +- ...MockMvcSpringBootTestIntegrationTests.java | 2 + ...cTesterSpringBootTestIntegrationTests.java | 92 +++++++++++ ...MvcTestAllControllersIntegrationTests.java | 38 ++--- .../WebMvcTestConverterIntegrationTests.java | 14 +- ...stomDispatcherServletIntegrationTests.java | 18 +-- .../WebMvcTestHateoasIntegrationTests.java | 20 +-- .../WebMvcTestNestedIntegrationTests.java | 30 ++-- ...bMvcTestOneControllerIntegrationTests.java | 19 ++- .../WebMvcTestPageableIntegrationTests.java | 17 +-- ...WebMvcTestPrintAlwaysIntegrationTests.java | 13 +- ...ebMvcTestPrintDefaultIntegrationTests.java | 19 +-- ...tPrintDefaultOverrideIntegrationTests.java | 13 +- ...bMvcTestPrintOverrideIntegrationTests.java | 13 +- ...bMvcTestServletFilterIntegrationTests.java | 13 +- ...rRegistrationDisabledIntegrationTests.java | 13 +- ...hAutoConfigureMockMvcIntegrationTests.java | 11 +- .../SpringBootContextLoaderMockMvcTests.java | 16 +- .../SampleActuatorLog4J2ApplicationTests.java | 20 +-- .../jdbc/SampleDataJdbcApplicationTests.java | 29 +--- .../jpa/SampleDataJpaApplicationTests.java | 26 +--- .../SpyBeanSampleDataJpaApplicationTests.java | 26 +--- .../rest/SampleDataRestApplicationTests.java | 62 ++++---- .../jpa/SampleJpaApplicationTests.java | 25 +-- .../SampleJUnitVintageApplicationTests.java | 13 +- ...UserVehicleControllerApplicationTests.java | 16 +- .../test/web/UserVehicleControllerTests.java | 43 +++--- .../MessageControllerWebTests.java | 55 +++---- .../thymeleaf/MessageControllerWebTests.java | 55 +++---- 77 files changed, 1050 insertions(+), 1239 deletions(-) create mode 100644 spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/MockMvcTesterSpringBootTestIntegrationTests.java diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/cloudfoundry/servlet/CloudFoundryActuatorAutoConfigurationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/cloudfoundry/servlet/CloudFoundryActuatorAutoConfigurationTests.java index 067eea9794..ea064bf689 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/cloudfoundry/servlet/CloudFoundryActuatorAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/cloudfoundry/servlet/CloudFoundryActuatorAutoConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -54,15 +54,12 @@ import org.springframework.security.config.BeanIds; import org.springframework.security.web.FilterChainProxy; import org.springframework.security.web.SecurityFilterChain; import org.springframework.test.util.ReflectionTestUtils; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.test.web.servlet.assertj.MockMvcTester; import org.springframework.web.client.RestTemplate; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.filter.CompositeFilter; import static org.assertj.core.api.Assertions.assertThat; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; /** * Tests for {@link CloudFoundryActuatorAutoConfiguration}. @@ -109,8 +106,8 @@ class CloudFoundryActuatorAutoConfigurationTests { .withPropertyValues("VCAP_APPLICATION:---", "vcap.application.application_id:my-app-id", "vcap.application.cf_api:https://my-cloud-controller.com") .run((context) -> { - MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(context).build(); - mockMvc.perform(get("/cloudfoundryapplication")).andExpect(header().string("Content-Type", V3_JSON)); + MockMvcTester mvc = MockMvcTester.from(context); + assertThat(mvc.get().uri("/cloudfoundryapplication")).hasHeader("Content-Type", V3_JSON); }); } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/AuditEventsEndpointDocumentationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/AuditEventsEndpointDocumentationTests.java index aaf3805f91..ce2af67141 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/AuditEventsEndpointDocumentationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/AuditEventsEndpointDocumentationTests.java @@ -31,6 +31,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; +import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.BDDMockito.given; import static org.mockito.BDDMockito.then; @@ -39,8 +40,6 @@ import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWit import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName; import static org.springframework.restdocs.request.RequestDocumentation.queryParameters; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; /** * Tests for generating documentation describing {@link AuditEventsEndpoint}. @@ -53,13 +52,12 @@ class AuditEventsEndpointDocumentationTests extends MockMvcEndpointDocumentation private AuditEventRepository repository; @Test - void allAuditEvents() throws Exception { + void allAuditEvents() { String queryTimestamp = "2017-11-07T09:37Z"; given(this.repository.find(any(), any(), any())) .willReturn(List.of(new AuditEvent("alice", "logout", Collections.emptyMap()))); - this.mockMvc.perform(get("/actuator/auditevents").param("after", queryTimestamp)) - .andExpect(status().isOk()) - .andDo(document("auditevents/all", + assertThat(this.mvc.get().uri("/actuator/auditevents").param("after", queryTimestamp)).hasStatusOk() + .apply(document("auditevents/all", responseFields(fieldWithPath("events").description("An array of audit events."), fieldWithPath("events.[].timestamp") .description("The timestamp of when the event occurred."), @@ -68,17 +66,18 @@ class AuditEventsEndpointDocumentationTests extends MockMvcEndpointDocumentation } @Test - void filteredAuditEvents() throws Exception { + void filteredAuditEvents() { OffsetDateTime now = OffsetDateTime.now(); String queryTimestamp = DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(now); given(this.repository.find("alice", now.toInstant(), "logout")) .willReturn(List.of(new AuditEvent("alice", "logout", Collections.emptyMap()))); - this.mockMvc - .perform(get("/actuator/auditevents").param("principal", "alice") - .param("after", queryTimestamp) - .param("type", "logout")) - .andExpect(status().isOk()) - .andDo(document("auditevents/filtered", + assertThat(this.mvc.get() + .uri("/actuator/auditevents") + .param("principal", "alice") + .param("after", queryTimestamp) + .param("type", "logout")) + .hasStatusOk() + .apply(document("auditevents/filtered", queryParameters( parameterWithName("after").description( "Restricts the events to those that occurred after the given time. Optional."), diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/BeansEndpointDocumentationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/BeansEndpointDocumentationTests.java index 4eb3fb8bcd..882d5f57a0 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/BeansEndpointDocumentationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/BeansEndpointDocumentationTests.java @@ -33,12 +33,11 @@ import org.springframework.restdocs.payload.JsonFieldType; import org.springframework.restdocs.payload.ResponseFieldsSnippet; import org.springframework.util.CollectionUtils; +import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessResponse; import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; /** * Tests for generating documentation describing {@link BeansEndpoint}. @@ -48,7 +47,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. class BeansEndpointDocumentationTests extends MockMvcEndpointDocumentationTests { @Test - void beans() throws Exception { + void beans() { List beanFields = List.of(fieldWithPath("aliases").description("Names of any aliases."), fieldWithPath("scope").description("Scope of the bean."), fieldWithPath("type").description("Fully qualified type of the bean."), @@ -60,9 +59,8 @@ class BeansEndpointDocumentationTests extends MockMvcEndpointDocumentationTests fieldWithPath("contexts").description("Application contexts keyed by id."), parentIdField(), fieldWithPath("contexts.*.beans").description("Beans in the application context keyed by name.")) .andWithPrefix("contexts.*.beans.*.", beanFields); - this.mockMvc.perform(get("/actuator/beans")) - .andExpect(status().isOk()) - .andDo(document("beans", + assertThat(this.mvc.get().uri("/actuator/beans")).hasStatusOk() + .apply(document("beans", preprocessResponse( limit(this::isIndependentBean, "contexts", getApplicationContext().getId(), "beans")), responseFields)); diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/CachesEndpointDocumentationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/CachesEndpointDocumentationTests.java index 44cf427a29..7f51ce42c4 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/CachesEndpointDocumentationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/CachesEndpointDocumentationTests.java @@ -30,17 +30,16 @@ import org.springframework.cache.concurrent.ConcurrentMapCacheManager; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; +import org.springframework.http.HttpStatus; import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation; import org.springframework.restdocs.payload.FieldDescriptor; import org.springframework.restdocs.request.ParameterDescriptor; +import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName; import static org.springframework.restdocs.request.RequestDocumentation.queryParameters; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; /** * Tests for generating documentation describing the {@link CachesEndpoint} @@ -59,10 +58,9 @@ class CachesEndpointDocumentationTests extends MockMvcEndpointDocumentationTests .optional()); @Test - void allCaches() throws Exception { - this.mockMvc.perform(get("/actuator/caches")) - .andExpect(status().isOk()) - .andDo(MockMvcRestDocumentation.document("caches/all", + void allCaches() { + assertThat(this.mvc.get().uri("/actuator/caches")).hasStatusOk() + .apply(MockMvcRestDocumentation.document("caches/all", responseFields(fieldWithPath("cacheManagers").description("Cache managers keyed by id."), fieldWithPath("cacheManagers.*.caches") .description("Caches in the application context keyed by name.")) @@ -71,25 +69,23 @@ class CachesEndpointDocumentationTests extends MockMvcEndpointDocumentationTests } @Test - void namedCache() throws Exception { - this.mockMvc.perform(get("/actuator/caches/cities")) - .andExpect(status().isOk()) - .andDo(MockMvcRestDocumentation.document("caches/named", queryParameters(queryParameters), + void namedCache() { + assertThat(this.mvc.get().uri("/actuator/caches/cities")).hasStatusOk() + .apply(MockMvcRestDocumentation.document("caches/named", queryParameters(queryParameters), responseFields(levelFields))); } @Test - void evictAllCaches() throws Exception { - this.mockMvc.perform(delete("/actuator/caches")) - .andExpect(status().isNoContent()) - .andDo(MockMvcRestDocumentation.document("caches/evict-all")); + void evictAllCaches() { + assertThat(this.mvc.delete().uri("/actuator/caches")).hasStatus(HttpStatus.NO_CONTENT) + .apply(MockMvcRestDocumentation.document("caches/evict-all")); } @Test - void evictNamedCache() throws Exception { - this.mockMvc.perform(delete("/actuator/caches/countries?cacheManager=anotherCacheManager")) - .andExpect(status().isNoContent()) - .andDo(MockMvcRestDocumentation.document("caches/evict-named", queryParameters(queryParameters))); + void evictNamedCache() { + assertThat(this.mvc.delete().uri("/actuator/caches/countries?cacheManager=anotherCacheManager")) + .hasStatus(HttpStatus.NO_CONTENT) + .apply(MockMvcRestDocumentation.document("caches/evict-named", queryParameters(queryParameters))); } @Configuration(proxyBeanMethods = false) diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/ConditionsReportEndpointDocumentationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/ConditionsReportEndpointDocumentationTests.java index 58586569d1..63cf79092e 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/ConditionsReportEndpointDocumentationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/ConditionsReportEndpointDocumentationTests.java @@ -31,11 +31,10 @@ import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation; import org.springframework.restdocs.payload.FieldDescriptor; import org.springframework.restdocs.payload.JsonFieldType; +import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessResponse; import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; /** * Tests for generating documentation describing {@link ConditionsReportEndpoint}. @@ -64,9 +63,8 @@ class ConditionsReportEndpointDocumentationTests extends MockMvcEndpointDocument .optional()); FieldDescriptor unconditionalClassesField = fieldWithPath("contexts.*.unconditionalClasses") .description("Names of unconditional auto-configuration classes if any."); - this.mockMvc.perform(get("/actuator/conditions")) - .andExpect(status().isOk()) - .andDo(MockMvcRestDocumentation.document("conditions", + assertThat(this.mvc.get().uri("/actuator/conditions")).hasStatusOk() + .apply(MockMvcRestDocumentation.document("conditions", preprocessResponse(limit("contexts", getApplicationContext().getId(), "positiveMatches"), limit("contexts", getApplicationContext().getId(), "negativeMatches")), responseFields(fieldWithPath("contexts").description("Application contexts keyed by id.")) diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/ConfigurationPropertiesReportEndpointDocumentationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/ConfigurationPropertiesReportEndpointDocumentationTests.java index d29a789351..edba8a0c74 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/ConfigurationPropertiesReportEndpointDocumentationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/ConfigurationPropertiesReportEndpointDocumentationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,12 +27,11 @@ import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation; +import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessResponse; import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; import static org.springframework.restdocs.payload.PayloadDocumentation.subsectionWithPath; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; /** * Tests for generating documentation describing @@ -44,10 +43,9 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. class ConfigurationPropertiesReportEndpointDocumentationTests extends MockMvcEndpointDocumentationTests { @Test - void configProps() throws Exception { - this.mockMvc.perform(get("/actuator/configprops")) - .andExpect(status().isOk()) - .andDo(MockMvcRestDocumentation.document("configprops/all", + void configProps() { + assertThat(this.mvc.get().uri("/actuator/configprops")).hasStatusOk() + .apply(MockMvcRestDocumentation.document("configprops/all", preprocessResponse(limit("contexts", getApplicationContext().getId(), "beans")), responseFields(fieldWithPath("contexts").description("Application contexts keyed by id."), fieldWithPath("contexts.*.beans.*") @@ -62,10 +60,9 @@ class ConfigurationPropertiesReportEndpointDocumentationTests extends MockMvcEnd } @Test - void configPropsFilterByPrefix() throws Exception { - this.mockMvc.perform(get("/actuator/configprops/spring.jackson")) - .andExpect(status().isOk()) - .andDo(MockMvcRestDocumentation.document("configprops/prefixed", + void configPropsFilterByPrefix() { + assertThat(this.mvc.get().uri("/actuator/configprops/spring.jackson")).hasStatusOk() + .apply(MockMvcRestDocumentation.document("configprops/prefixed", preprocessResponse(limit("contexts", getApplicationContext().getId(), "beans")), responseFields(fieldWithPath("contexts").description("Application contexts keyed by id."), fieldWithPath("contexts.*.beans.*") diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/EnvironmentEndpointDocumentationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/EnvironmentEndpointDocumentationTests.java index c046567f11..6b8cda6ea7 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/EnvironmentEndpointDocumentationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/EnvironmentEndpointDocumentationTests.java @@ -44,13 +44,12 @@ import org.springframework.restdocs.operation.preprocess.OperationPreprocessor; import org.springframework.restdocs.payload.FieldDescriptor; import org.springframework.test.context.TestPropertySource; +import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessResponse; import static org.springframework.restdocs.operation.preprocess.Preprocessors.replacePattern; import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; /** * Tests for generating documentation describing the {@link EnvironmentEndpoint}. @@ -74,10 +73,9 @@ class EnvironmentEndpointDocumentationTests extends MockMvcEndpointDocumentation .description("Name of the property source."); @Test - void env() throws Exception { - this.mockMvc.perform(get("/actuator/env")) - .andExpect(status().isOk()) - .andDo(document("env/all", + void env() { + assertThat(this.mvc.get().uri("/actuator/env")).hasStatusOk() + .apply(document("env/all", preprocessResponse( replacePattern(Pattern.compile( "org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/"), ""), @@ -93,10 +91,9 @@ class EnvironmentEndpointDocumentationTests extends MockMvcEndpointDocumentation } @Test - void singlePropertyFromEnv() throws Exception { - this.mockMvc.perform(get("/actuator/env/com.example.cache.max-size")) - .andExpect(status().isOk()) - .andDo(document("env/single", + void singlePropertyFromEnv() { + assertThat(this.mvc.get().uri("/actuator/env/com.example.cache.max-size")).hasStatusOk() + .apply(document("env/single", preprocessResponse(replacePattern(Pattern .compile("org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/"), "")), responseFields( diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/FlywayEndpointDocumentationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/FlywayEndpointDocumentationTests.java index 591b40e723..6f41357d8a 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/FlywayEndpointDocumentationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/FlywayEndpointDocumentationTests.java @@ -35,10 +35,9 @@ import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation; import org.springframework.restdocs.payload.FieldDescriptor; +import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; /** * Tests for generating documentation describing the {@link FlywayEndpoint}. @@ -48,10 +47,9 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. class FlywayEndpointDocumentationTests extends MockMvcEndpointDocumentationTests { @Test - void flyway() throws Exception { - this.mockMvc.perform(get("/actuator/flyway")) - .andExpect(status().isOk()) - .andDo(MockMvcRestDocumentation.document("flyway", + void flyway() { + assertThat(this.mvc.get().uri("/actuator/flyway")).hasStatusOk() + .apply(MockMvcRestDocumentation.document("flyway", responseFields(fieldWithPath("contexts").description("Application contexts keyed by id"), fieldWithPath("contexts.*.flywayBeans.*.migrations") .description("Migrations performed by the Flyway instance, keyed by Flyway bean name.")) diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/HealthEndpointDocumentationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/HealthEndpointDocumentationTests.java index cc6920b3bf..c045708201 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/HealthEndpointDocumentationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/HealthEndpointDocumentationTests.java @@ -52,12 +52,11 @@ import org.springframework.http.MediaType; import org.springframework.restdocs.payload.FieldDescriptor; import org.springframework.util.unit.DataSize; +import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; import static org.springframework.restdocs.payload.PayloadDocumentation.subsectionWithPath; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; /** * Tests for generating documentation describing the {@link HealthEndpoint}. @@ -72,7 +71,7 @@ class HealthEndpointDocumentationTests extends MockMvcEndpointDocumentationTests subsectionWithPath("details").description("Details of the health of a specific part of the application.")); @Test - void health() throws Exception { + void health() { FieldDescriptor status = fieldWithPath("status").description("Overall status of the application."); FieldDescriptor components = fieldWithPath("components").description("The components that make up the health."); FieldDescriptor componentStatus = fieldWithPath("components.*.status") @@ -84,24 +83,21 @@ class HealthEndpointDocumentationTests extends MockMvcEndpointDocumentationTests .description("Details of the health of a specific part of the application. " + "Presence is controlled by `management.endpoint.health.show-details`.") .optional(); - this.mockMvc.perform(get("/actuator/health").accept(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) - .andDo(document("health", + assertThat(this.mvc.get().uri("/actuator/health").accept(MediaType.APPLICATION_JSON)).hasStatusOk() + .apply(document("health", responseFields(status, components, componentStatus, nestedComponents, componentDetails))); } @Test - void healthComponent() throws Exception { - this.mockMvc.perform(get("/actuator/health/db").accept(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) - .andDo(document("health/component", responseFields(componentFields))); + void healthComponent() { + assertThat(this.mvc.get().uri("/actuator/health/db").accept(MediaType.APPLICATION_JSON)).hasStatusOk() + .apply(document("health/component", responseFields(componentFields))); } @Test - void healthComponentInstance() throws Exception { - this.mockMvc.perform(get("/actuator/health/broker/us1").accept(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) - .andDo(document("health/instance", responseFields(componentFields))); + void healthComponentInstance() { + assertThat(this.mvc.get().uri("/actuator/health/broker/us1").accept(MediaType.APPLICATION_JSON)).hasStatusOk() + .apply(document("health/instance", responseFields(componentFields))); } @Configuration(proxyBeanMethods = false) diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/HeapDumpWebEndpointDocumentationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/HeapDumpWebEndpointDocumentationTests.java index fc0f19fc1b..d82fccef53 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/HeapDumpWebEndpointDocumentationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/HeapDumpWebEndpointDocumentationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -32,9 +32,8 @@ import org.springframework.restdocs.cli.CurlRequestSnippet; import org.springframework.restdocs.operation.Operation; import org.springframework.util.FileCopyUtils; +import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; /** * Tests for generating documentation describing the {@link HeapDumpWebEndpoint}. @@ -44,10 +43,9 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. class HeapDumpWebEndpointDocumentationTests extends MockMvcEndpointDocumentationTests { @Test - void heapDump() throws Exception { - this.mockMvc.perform(get("/actuator/heapdump")) - .andExpect(status().isOk()) - .andDo(document("heapdump", new CurlRequestSnippet(CliDocumentation.multiLineFormat()) { + void heapDump() { + assertThat(this.mvc.get().uri("/actuator/heapdump")).hasStatusOk() + .apply(document("heapdump", new CurlRequestSnippet(CliDocumentation.multiLineFormat()) { @Override protected Map createModel(Operation operation) { diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/HttpExchangesEndpointDocumentationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/HttpExchangesEndpointDocumentationTests.java index 95a91984ce..c8409df799 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/HttpExchangesEndpointDocumentationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/HttpExchangesEndpointDocumentationTests.java @@ -42,13 +42,12 @@ import org.springframework.context.annotation.Import; import org.springframework.http.HttpHeaders; import org.springframework.restdocs.payload.JsonFieldType; +import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.mock; import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; /** * Tests for generating documentation describing {@link HttpExchangesEndpoint}. @@ -61,7 +60,7 @@ class HttpExchangesEndpointDocumentationTests extends MockMvcEndpointDocumentati private HttpExchangeRepository repository; @Test - void httpExchanges() throws Exception { + void httpExchanges() { RecordableHttpRequest request = mock(RecordableHttpRequest.class); given(request.getUri()).willReturn(URI.create("https://api.example.com")); given(request.getMethod()).willReturn("GET"); @@ -79,9 +78,8 @@ class HttpExchangesEndpointDocumentationTests extends MockMvcEndpointDocumentati HttpExchange exchange = HttpExchange.start(start, request) .finish(end, response, () -> principal, () -> UUID.randomUUID().toString(), EnumSet.allOf(Include.class)); given(this.repository.findAll()).willReturn(List.of(exchange)); - this.mockMvc.perform(get("/actuator/httpexchanges")) - .andExpect(status().isOk()) - .andDo(document("httpexchanges", responseFields( + assertThat(this.mvc.get().uri("/actuator/httpexchanges")).hasStatusOk() + .apply(document("httpexchanges", responseFields( fieldWithPath("exchanges").description("An array of HTTP request-response exchanges."), fieldWithPath("exchanges.[].timestamp").description("Timestamp of when the exchange occurred."), fieldWithPath("exchanges.[].principal").description("Principal of the exchange, if any.") diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/InfoEndpointDocumentationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/InfoEndpointDocumentationTests.java index 39987ab5c5..63b760f6e5 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/InfoEndpointDocumentationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/InfoEndpointDocumentationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -34,11 +34,10 @@ import org.springframework.context.annotation.Import; import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation; import org.springframework.restdocs.payload.JsonFieldType; +import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.restdocs.payload.PayloadDocumentation.beneathPath; import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; /** * Tests for generating documentation describing the {@link InfoEndpoint}. @@ -48,10 +47,9 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. class InfoEndpointDocumentationTests extends MockMvcEndpointDocumentationTests { @Test - void info() throws Exception { - this.mockMvc.perform(get("/actuator/info")) - .andExpect(status().isOk()) - .andDo(MockMvcRestDocumentation.document("info", + void info() { + assertThat(this.mvc.get().uri("/actuator/info")).hasStatusOk() + .apply(MockMvcRestDocumentation.document("info", responseFields(beneathPath("git"), fieldWithPath("branch").description("Name of the Git branch, if any."), fieldWithPath("commit").description("Details of the Git commit, if any."), diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/IntegrationGraphEndpointDocumentationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/IntegrationGraphEndpointDocumentationTests.java index 36e7fb1e65..32b0b2a15c 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/IntegrationGraphEndpointDocumentationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/IntegrationGraphEndpointDocumentationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,13 +22,12 @@ import org.springframework.boot.actuate.integration.IntegrationGraphEndpoint; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; +import org.springframework.http.HttpStatus; import org.springframework.integration.config.EnableIntegration; import org.springframework.integration.graph.IntegrationGraphServer; import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.assertj.core.api.Assertions.assertThat; /** * Tests for generating documentation describing the {@link IntegrationGraphEndpoint}. @@ -38,17 +37,15 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. class IntegrationGraphEndpointDocumentationTests extends MockMvcEndpointDocumentationTests { @Test - void graph() throws Exception { - this.mockMvc.perform(get("/actuator/integrationgraph")) - .andExpect(status().isOk()) - .andDo(MockMvcRestDocumentation.document("integrationgraph/graph")); + void graph() { + assertThat(this.mvc.get().uri("/actuator/integrationgraph")).hasStatusOk() + .apply(MockMvcRestDocumentation.document("integrationgraph/graph")); } @Test - void rebuild() throws Exception { - this.mockMvc.perform(post("/actuator/integrationgraph")) - .andExpect(status().isNoContent()) - .andDo(MockMvcRestDocumentation.document("integrationgraph/rebuild")); + void rebuild() { + assertThat(this.mvc.post().uri("/actuator/integrationgraph")).hasStatus(HttpStatus.NO_CONTENT) + .apply(MockMvcRestDocumentation.document("integrationgraph/rebuild")); } @Configuration(proxyBeanMethods = false) diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/LiquibaseEndpointDocumentationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/LiquibaseEndpointDocumentationTests.java index cd12c81c2c..042e9e1e03 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/LiquibaseEndpointDocumentationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/LiquibaseEndpointDocumentationTests.java @@ -32,10 +32,9 @@ import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation; import org.springframework.restdocs.payload.FieldDescriptor; import org.springframework.restdocs.payload.JsonFieldType; +import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; /** * Tests for generating documentation describing the {@link LiquibaseEndpoint}. @@ -45,12 +44,11 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. class LiquibaseEndpointDocumentationTests extends MockMvcEndpointDocumentationTests { @Test - void liquibase() throws Exception { + void liquibase() { FieldDescriptor changeSetsField = fieldWithPath("contexts.*.liquibaseBeans.*.changeSets") .description("Change sets made by the Liquibase beans, keyed by bean name."); - this.mockMvc.perform(get("/actuator/liquibase")) - .andExpect(status().isOk()) - .andDo(MockMvcRestDocumentation.document("liquibase", + assertThat(this.mvc.get().uri("/actuator/liquibase")).hasStatusOk() + .apply(MockMvcRestDocumentation.document("liquibase", responseFields(fieldWithPath("contexts").description("Application contexts keyed by id"), changeSetsField) .andWithPrefix("contexts.*.liquibaseBeans.*.changeSets[].", getChangeSetFieldDescriptors()) diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/LogFileWebEndpointDocumentationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/LogFileWebEndpointDocumentationTests.java index cb80ee01f2..84ddd459bb 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/LogFileWebEndpointDocumentationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/LogFileWebEndpointDocumentationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,11 +23,11 @@ import org.springframework.boot.logging.LogFile; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; +import org.springframework.http.HttpStatus; import org.springframework.mock.env.MockEnvironment; import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.assertj.core.api.Assertions.assertThat; /** * Tests for generating documentation describing the {@link LogFileWebEndpoint}. @@ -37,17 +37,16 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. class LogFileWebEndpointDocumentationTests extends MockMvcEndpointDocumentationTests { @Test - void logFile() throws Exception { - this.mockMvc.perform(get("/actuator/logfile")) - .andExpect(status().isOk()) - .andDo(MockMvcRestDocumentation.document("logfile/entire")); + void logFile() { + assertThat(this.mvc.get().uri("/actuator/logfile")).hasStatusOk() + .apply(MockMvcRestDocumentation.document("logfile/entire")); } @Test - void logFileRange() throws Exception { - this.mockMvc.perform(get("/actuator/logfile").header("Range", "bytes=0-1023")) - .andExpect(status().isPartialContent()) - .andDo(MockMvcRestDocumentation.document("logfile/range")); + void logFileRange() { + assertThat(this.mvc.get().uri("/actuator/logfile").header("Range", "bytes=0-1023")) + .hasStatus(HttpStatus.PARTIAL_CONTENT) + .apply(MockMvcRestDocumentation.document("logfile/range")); } @Configuration(proxyBeanMethods = false) diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/LoggersEndpointDocumentationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/LoggersEndpointDocumentationTests.java index acc1b10a21..1e4e47d009 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/LoggersEndpointDocumentationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/LoggersEndpointDocumentationTests.java @@ -33,19 +33,18 @@ import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; +import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation; import org.springframework.restdocs.payload.FieldDescriptor; import org.springframework.restdocs.payload.JsonFieldType; +import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.BDDMockito.given; import static org.mockito.BDDMockito.then; import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; import static org.springframework.restdocs.payload.PayloadDocumentation.requestFields; import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; /** * Tests for generating documentation describing the {@link LoggersEndpoint}. @@ -70,14 +69,13 @@ class LoggersEndpointDocumentationTests extends MockMvcEndpointDocumentationTest private LoggerGroups loggerGroups; @Test - void allLoggers() throws Exception { + void allLoggers() { given(this.loggingSystem.getSupportedLogLevels()).willReturn(EnumSet.allOf(LogLevel.class)); given(this.loggingSystem.getLoggerConfigurations()) .willReturn(List.of(new LoggerConfiguration("ROOT", LogLevel.INFO, LogLevel.INFO), new LoggerConfiguration("com.example", LogLevel.DEBUG, LogLevel.DEBUG))); - this.mockMvc.perform(get("/actuator/loggers")) - .andExpect(status().isOk()) - .andDo(MockMvcRestDocumentation.document("loggers/all", + assertThat(this.mvc.get().uri("/actuator/loggers")).hasStatusOk() + .apply(MockMvcRestDocumentation.document("loggers/all", responseFields(fieldWithPath("levels").description("Levels support by the logging system."), fieldWithPath("loggers").description("Loggers keyed by name."), fieldWithPath("groups").description("Logger groups keyed by name")) @@ -86,31 +84,30 @@ class LoggersEndpointDocumentationTests extends MockMvcEndpointDocumentationTest } @Test - void logger() throws Exception { + void logger() { given(this.loggingSystem.getLoggerConfiguration("com.example")) .willReturn(new LoggerConfiguration("com.example", LogLevel.INFO, LogLevel.INFO)); - this.mockMvc.perform(get("/actuator/loggers/com.example")) - .andExpect(status().isOk()) - .andDo(MockMvcRestDocumentation.document("loggers/single", responseFields(levelFields))); + assertThat(this.mvc.get().uri("/actuator/loggers/com.example")).hasStatusOk() + .apply(MockMvcRestDocumentation.document("loggers/single", responseFields(levelFields))); } @Test - void loggerGroups() throws Exception { + void loggerGroups() { this.loggerGroups.get("test").configureLogLevel(LogLevel.INFO, (member, level) -> { }); - this.mockMvc.perform(get("/actuator/loggers/test")) - .andExpect(status().isOk()) - .andDo(MockMvcRestDocumentation.document("loggers/group", responseFields(groupLevelFields))); + assertThat(this.mvc.get().uri("/actuator/loggers/test")).hasStatusOk() + .apply(MockMvcRestDocumentation.document("loggers/group", responseFields(groupLevelFields))); resetLogger(); } @Test - void setLogLevel() throws Exception { - this.mockMvc - .perform(post("/actuator/loggers/com.example").content("{\"configuredLevel\":\"debug\"}") - .contentType(MediaType.APPLICATION_JSON)) - .andExpect(status().isNoContent()) - .andDo(MockMvcRestDocumentation.document("loggers/set", + void setLogLevel() { + assertThat(this.mvc.post() + .uri("/actuator/loggers/com.example") + .content("{\"configuredLevel\":\"debug\"}") + .contentType(MediaType.APPLICATION_JSON)) + .hasStatus(HttpStatus.NO_CONTENT) + .apply(MockMvcRestDocumentation.document("loggers/set", requestFields(fieldWithPath("configuredLevel") .description("Level for the logger. May be omitted to clear the level.") .optional()))); @@ -118,12 +115,13 @@ class LoggersEndpointDocumentationTests extends MockMvcEndpointDocumentationTest } @Test - void setLogLevelOfLoggerGroup() throws Exception { - this.mockMvc - .perform(post("/actuator/loggers/test").content("{\"configuredLevel\":\"debug\"}") - .contentType(MediaType.APPLICATION_JSON)) - .andExpect(status().isNoContent()) - .andDo(MockMvcRestDocumentation.document("loggers/setGroup", + void setLogLevelOfLoggerGroup() { + assertThat(this.mvc.post() + .uri("/actuator/loggers/test") + .content("{\"configuredLevel\":\"debug\"}") + .contentType(MediaType.APPLICATION_JSON)) + .hasStatus(HttpStatus.NO_CONTENT) + .apply(MockMvcRestDocumentation.document("loggers/setGroup", requestFields(fieldWithPath("configuredLevel") .description("Level for the logger group. May be omitted to clear the level of the loggers.") .optional()))); @@ -138,11 +136,12 @@ class LoggersEndpointDocumentationTests extends MockMvcEndpointDocumentationTest } @Test - void clearLogLevel() throws Exception { - this.mockMvc - .perform(post("/actuator/loggers/com.example").content("{}").contentType(MediaType.APPLICATION_JSON)) - .andExpect(status().isNoContent()) - .andDo(MockMvcRestDocumentation.document("loggers/clear")); + void clearLogLevel() { + assertThat(this.mvc.post() + .uri("/actuator/loggers/com.example") + .content("{}") + .contentType(MediaType.APPLICATION_JSON)).hasStatus(HttpStatus.NO_CONTENT) + .apply(MockMvcRestDocumentation.document("loggers/clear")); then(this.loggingSystem).should().setLogLevel("com.example", null); } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/MetricsEndpointDocumentationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/MetricsEndpointDocumentationTests.java index 3faa23d9ab..feadcd13cc 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/MetricsEndpointDocumentationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/MetricsEndpointDocumentationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,13 +26,12 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; +import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName; import static org.springframework.restdocs.request.RequestDocumentation.queryParameters; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; /** * Tests for generating documentation describing the {@link MetricsEndpoint}. @@ -42,18 +41,16 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. class MetricsEndpointDocumentationTests extends MockMvcEndpointDocumentationTests { @Test - void metricNames() throws Exception { - this.mockMvc.perform(get("/actuator/metrics")) - .andExpect(status().isOk()) - .andDo(document("metrics/names", + void metricNames() { + assertThat(this.mvc.get().uri("/actuator/metrics")).hasStatusOk() + .apply(document("metrics/names", responseFields(fieldWithPath("names").description("Names of the known metrics.")))); } @Test - void metric() throws Exception { - this.mockMvc.perform(get("/actuator/metrics/jvm.memory.max")) - .andExpect(status().isOk()) - .andDo(document("metrics/metric", + void metric() { + assertThat(this.mvc.get().uri("/actuator/metrics/jvm.memory.max")).hasStatusOk() + .apply(document("metrics/metric", responseFields(fieldWithPath("name").description("Name of the metric"), fieldWithPath("description").description("Description of the metric"), fieldWithPath("baseUnit").description("Base unit of the metric"), @@ -67,12 +64,12 @@ class MetricsEndpointDocumentationTests extends MockMvcEndpointDocumentationTest } @Test - void metricWithTags() throws Exception { - this.mockMvc - .perform(get("/actuator/metrics/jvm.memory.max").param("tag", "area:nonheap") - .param("tag", "id:Compressed Class Space")) - .andExpect(status().isOk()) - .andDo(document("metrics/metric-with-tags", queryParameters( + void metricWithTags() { + assertThat(this.mvc.get() + .uri("/actuator/metrics/jvm.memory.max") + .param("tag", "area:nonheap") + .param("tag", "id:Compressed Class Space")).hasStatusOk() + .apply(document("metrics/metric-with-tags", queryParameters( parameterWithName("tag").description("A tag to use for drill-down in the form `name:value`.")))); } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/MockMvcEndpointDocumentationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/MockMvcEndpointDocumentationTests.java index fbfabbc3f4..cd61894880 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/MockMvcEndpointDocumentationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/MockMvcEndpointDocumentationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,13 +24,12 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.restdocs.RestDocumentationContextProvider; import org.springframework.restdocs.RestDocumentationExtension; import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.test.web.servlet.assertj.MockMvcTester; import org.springframework.web.context.WebApplicationContext; /** * Abstract base class for tests that generate endpoint documentation using Spring REST - * Docs and {@link MockMvc}. + * Docs and {@link MockMvcTester}. * * @author Andy Wilkinson */ @@ -38,16 +37,17 @@ import org.springframework.web.context.WebApplicationContext; @SpringBootTest public abstract class MockMvcEndpointDocumentationTests extends AbstractEndpointDocumentationTests { - protected MockMvc mockMvc; + protected MockMvcTester mvc; @Autowired private WebApplicationContext applicationContext; @BeforeEach void setup(RestDocumentationContextProvider restDocumentation) { - this.mockMvc = MockMvcBuilders.webAppContextSetup(this.applicationContext) - .apply(MockMvcRestDocumentation.documentationConfiguration(restDocumentation).uris()) - .build(); + this.mvc = MockMvcTester.from(this.applicationContext, + (builder) -> builder + .apply(MockMvcRestDocumentation.documentationConfiguration(restDocumentation).uris()) + .build()); } protected WebApplicationContext getApplicationContext() { diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/PrometheusScrapeEndpointDocumentationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/PrometheusScrapeEndpointDocumentationTests.java index 032fa92353..d744c03fc6 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/PrometheusScrapeEndpointDocumentationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/PrometheusScrapeEndpointDocumentationTests.java @@ -30,12 +30,10 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; +import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName; import static org.springframework.restdocs.request.RequestDocumentation.queryParameters; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; /** * Tests for generating documentation describing the {@link PrometheusScrapeEndpoint}. @@ -46,25 +44,28 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. class PrometheusScrapeEndpointDocumentationTests extends MockMvcEndpointDocumentationTests { @Test - void prometheus() throws Exception { - this.mockMvc.perform(get("/actuator/prometheus")).andExpect(status().isOk()).andDo(document("prometheus/all")); + void prometheus() { + assertThat(this.mvc.get().uri("/actuator/prometheus")).hasStatusOk().apply(document("prometheus/all")); } @Test - void prometheusOpenmetrics() throws Exception { - this.mockMvc.perform(get("/actuator/prometheus").accept(TextFormat.CONTENT_TYPE_OPENMETRICS_100)) - .andExpect(status().isOk()) - .andExpect(header().string("Content-Type", "application/openmetrics-text;version=1.0.0;charset=utf-8")) - .andDo(document("prometheus/openmetrics")); + void prometheusOpenmetrics() { + assertThat(this.mvc.get().uri("/actuator/prometheus").accept(TextFormat.CONTENT_TYPE_OPENMETRICS_100)) + .satisfies((result) -> { + assertThat(result).hasStatusOk() + .headers() + .hasValue("Content-Type", "application/openmetrics-text;version=1.0.0;charset=utf-8"); + assertThat(result).apply(document("prometheus/openmetrics")); + }); } @Test - void filteredPrometheus() throws Exception { - this.mockMvc - .perform(get("/actuator/prometheus").param("includedNames", - "jvm_memory_used_bytes,jvm_memory_committed_bytes")) - .andExpect(status().isOk()) - .andDo(document("prometheus/names", + void filteredPrometheus() { + assertThat(this.mvc.get() + .uri("/actuator/prometheus") + .param("includedNames", "jvm_memory_used_bytes,jvm_memory_committed_bytes")) + .hasStatusOk() + .apply(document("prometheus/names", queryParameters(parameterWithName("includedNames") .description("Restricts the samples to those that match the names. Optional.") .optional()))); diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/PrometheusSimpleclientScrapeEndpointDocumentationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/PrometheusSimpleclientScrapeEndpointDocumentationTests.java index 991a36e1db..6a06bf418a 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/PrometheusSimpleclientScrapeEndpointDocumentationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/PrometheusSimpleclientScrapeEndpointDocumentationTests.java @@ -27,12 +27,10 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; +import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName; import static org.springframework.restdocs.request.RequestDocumentation.queryParameters; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; /** * Tests for generating documentation describing the @@ -44,27 +42,30 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. class PrometheusSimpleclientScrapeEndpointDocumentationTests extends MockMvcEndpointDocumentationTests { @Test - void prometheus() throws Exception { - this.mockMvc.perform(get("/actuator/prometheus")) - .andExpect(status().isOk()) - .andDo(document("prometheus-simpleclient/all")); + void prometheus() { + assertThat(this.mvc.get().uri("/actuator/prometheus")).hasStatusOk() + .apply(document("prometheus-simpleclient/all")); } @Test - void prometheusOpenmetrics() throws Exception { - this.mockMvc.perform(get("/actuator/prometheus").accept(TextFormat.CONTENT_TYPE_OPENMETRICS_100)) - .andExpect(status().isOk()) - .andExpect(header().string("Content-Type", "application/openmetrics-text;version=1.0.0;charset=utf-8")) - .andDo(document("prometheus-simpleclient/openmetrics")); + void prometheusOpenmetrics() { + assertThat(this.mvc.get().uri("/actuator/prometheus").accept(TextFormat.CONTENT_TYPE_OPENMETRICS_100)) + .satisfies((result) -> { + assertThat(result).hasStatusOk() + .headers() + .hasValue("Content-Type", "application/openmetrics-text;version=1.0.0;charset=utf-8"); + assertThat(result).apply(document("prometheus-simpleclient/openmetrics")); + }); + } @Test - void filteredPrometheus() throws Exception { - this.mockMvc - .perform(get("/actuator/prometheus").param("includedNames", - "jvm_memory_used_bytes,jvm_memory_committed_bytes")) - .andExpect(status().isOk()) - .andDo(document("prometheus-simpleclient/names", + void filteredPrometheus() { + assertThat(this.mvc.get() + .uri("/actuator/prometheus") + .param("includedNames", "jvm_memory_used_bytes,jvm_memory_committed_bytes")) + .hasStatusOk() + .apply(document("prometheus-simpleclient/names", queryParameters(parameterWithName("includedNames") .description("Restricts the samples to those that match the names. Optional.") .optional()))); diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/QuartzEndpointDocumentationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/QuartzEndpointDocumentationTests.java index fd51daf5d1..9439ca1d51 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/QuartzEndpointDocumentationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/QuartzEndpointDocumentationTests.java @@ -64,6 +64,7 @@ import org.springframework.scheduling.quartz.DelegatingJob; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; +import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.mock; import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; @@ -71,8 +72,6 @@ import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWit import static org.springframework.restdocs.payload.PayloadDocumentation.relaxedResponseFields; import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; import static org.springframework.restdocs.payload.PayloadDocumentation.subsectionWithPath; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; /** * Tests for generating documentation describing the {@link QuartzEndpoint}. @@ -186,9 +185,8 @@ class QuartzEndpointDocumentationTests extends MockMvcEndpointDocumentationTests void quartzReport() throws Exception { mockJobs(jobOne, jobTwo, jobThree); mockTriggers(cronTrigger, simpleTrigger, calendarIntervalTrigger, dailyTimeIntervalTrigger); - this.mockMvc.perform(get("/actuator/quartz")) - .andExpect(status().isOk()) - .andDo(document("quartz/report", + assertThat(this.mvc.get().uri("/actuator/quartz")).hasStatusOk() + .apply(document("quartz/report", responseFields(fieldWithPath("jobs.groups").description("An array of job group names."), fieldWithPath("triggers.groups").description("An array of trigger group names.")))); } @@ -196,9 +194,8 @@ class QuartzEndpointDocumentationTests extends MockMvcEndpointDocumentationTests @Test void quartzJobs() throws Exception { mockJobs(jobOne, jobTwo, jobThree); - this.mockMvc.perform(get("/actuator/quartz/jobs")) - .andExpect(status().isOk()) - .andDo(document("quartz/jobs", + assertThat(this.mvc.get().uri("/actuator/quartz/jobs")).hasStatusOk() + .apply(document("quartz/jobs", responseFields(fieldWithPath("groups").description("Job groups keyed by name."), fieldWithPath("groups.*.jobs").description("An array of job names.")))); } @@ -206,9 +203,8 @@ class QuartzEndpointDocumentationTests extends MockMvcEndpointDocumentationTests @Test void quartzTriggers() throws Exception { mockTriggers(cronTrigger, simpleTrigger, calendarIntervalTrigger, dailyTimeIntervalTrigger); - this.mockMvc.perform(get("/actuator/quartz/triggers")) - .andExpect(status().isOk()) - .andDo(document("quartz/triggers", + assertThat(this.mvc.get().uri("/actuator/quartz/triggers")).hasStatusOk() + .apply(document("quartz/triggers", responseFields(fieldWithPath("groups").description("Trigger groups keyed by name."), fieldWithPath("groups.*.paused").description("Whether this trigger group is paused."), fieldWithPath("groups.*.triggers").description("An array of trigger names.")))); @@ -217,9 +213,8 @@ class QuartzEndpointDocumentationTests extends MockMvcEndpointDocumentationTests @Test void quartzJobGroup() throws Exception { mockJobs(jobOne, jobTwo, jobThree); - this.mockMvc.perform(get("/actuator/quartz/jobs/samples")) - .andExpect(status().isOk()) - .andDo(document("quartz/job-group", responseFields(fieldWithPath("group").description("Name of the group."), + assertThat(this.mvc.get().uri("/actuator/quartz/jobs/samples")).hasStatusOk() + .apply(document("quartz/job-group", responseFields(fieldWithPath("group").description("Name of the group."), fieldWithPath("jobs").description("Job details keyed by name."), fieldWithPath("jobs.*.className").description("Fully qualified name of the job implementation.")))); } @@ -250,9 +245,8 @@ class QuartzEndpointDocumentationTests extends MockMvcEndpointDocumentationTests given(customTrigger.getPreviousFireTime()).willReturn(fromUtc("2020-07-14T16:00:00Z")); given(customTrigger.getNextFireTime()).willReturn(fromUtc("2021-07-14T16:00:00Z")); mockTriggers(cron, simple, calendarInterval, tueThuTrigger, customTrigger); - this.mockMvc.perform(get("/actuator/quartz/triggers/tests")) - .andExpect(status().isOk()) - .andDo(document("quartz/trigger-group", + assertThat(this.mvc.get().uri("/actuator/quartz/triggers/tests")).hasStatusOk() + .apply(document("quartz/trigger-group", responseFields(fieldWithPath("group").description("Name of the group."), fieldWithPath("paused").description("Whether the group is paused."), fieldWithPath("triggers.cron").description("Cron triggers keyed by name, if any."), @@ -281,9 +275,8 @@ class QuartzEndpointDocumentationTests extends MockMvcEndpointDocumentationTests mockTriggers(firstTrigger, secondTrigger); given(this.scheduler.getTriggersOfJob(jobOne.getKey())) .willAnswer((invocation) -> List.of(firstTrigger, secondTrigger)); - this.mockMvc.perform(get("/actuator/quartz/jobs/samples/jobOne")) - .andExpect(status().isOk()) - .andDo(document("quartz/job-details", responseFields( + assertThat(this.mvc.get().uri("/actuator/quartz/jobs/samples/jobOne")).hasStatusOk() + .apply(document("quartz/job-details", responseFields( fieldWithPath("group").description("Name of the group."), fieldWithPath("name").description("Name of the job."), fieldWithPath("description").description("Description of the job, if any."), @@ -301,9 +294,8 @@ class QuartzEndpointDocumentationTests extends MockMvcEndpointDocumentationTests @Test void quartzTriggerCommon() throws Exception { setupTriggerDetails(cronTrigger.getTriggerBuilder(), TriggerState.NORMAL); - this.mockMvc.perform(get("/actuator/quartz/triggers/samples/example")) - .andExpect(status().isOk()) - .andDo(document("quartz/trigger-details-common", responseFields(commonCronDetails).and(subsectionWithPath( + assertThat(this.mvc.get().uri("/actuator/quartz/triggers/samples/example")).hasStatusOk() + .apply(document("quartz/trigger-details-common", responseFields(commonCronDetails).and(subsectionWithPath( "calendarInterval") .description( "Calendar time interval trigger details, if any. Present when `type` is `calendarInterval`.") @@ -330,9 +322,8 @@ class QuartzEndpointDocumentationTests extends MockMvcEndpointDocumentationTests @Test void quartzTriggerCron() throws Exception { setupTriggerDetails(cronTrigger.getTriggerBuilder(), TriggerState.NORMAL); - this.mockMvc.perform(get("/actuator/quartz/triggers/samples/example")) - .andExpect(status().isOk()) - .andDo(document("quartz/trigger-details-cron", + assertThat(this.mvc.get().uri("/actuator/quartz/triggers/samples/example")).hasStatusOk() + .apply(document("quartz/trigger-details-cron", relaxedResponseFields(fieldWithPath("cron").description("Cron trigger specific details.")) .andWithPrefix("cron.", cronTriggerSummary))); } @@ -340,9 +331,8 @@ class QuartzEndpointDocumentationTests extends MockMvcEndpointDocumentationTests @Test void quartzTriggerSimple() throws Exception { setupTriggerDetails(simpleTrigger.getTriggerBuilder(), TriggerState.NORMAL); - this.mockMvc.perform(get("/actuator/quartz/triggers/samples/example")) - .andExpect(status().isOk()) - .andDo(document("quartz/trigger-details-simple", + assertThat(this.mvc.get().uri("/actuator/quartz/triggers/samples/example")).hasStatusOk() + .apply(document("quartz/trigger-details-simple", relaxedResponseFields(fieldWithPath("simple").description("Simple trigger specific details.")) .andWithPrefix("simple.", simpleTriggerSummary) .and(repeatCount("simple."), timesTriggered("simple.")))); @@ -351,9 +341,8 @@ class QuartzEndpointDocumentationTests extends MockMvcEndpointDocumentationTests @Test void quartzTriggerCalendarInterval() throws Exception { setupTriggerDetails(calendarIntervalTrigger.getTriggerBuilder(), TriggerState.NORMAL); - this.mockMvc.perform(get("/actuator/quartz/triggers/samples/example")) - .andExpect(status().isOk()) - .andDo(document("quartz/trigger-details-calendar-interval", + assertThat(this.mvc.get().uri("/actuator/quartz/triggers/samples/example")).hasStatusOk() + .apply(document("quartz/trigger-details-calendar-interval", relaxedResponseFields(fieldWithPath("calendarInterval") .description("Calendar interval trigger specific details.")) .andWithPrefix("calendarInterval.", calendarIntervalTriggerSummary) @@ -368,9 +357,8 @@ class QuartzEndpointDocumentationTests extends MockMvcEndpointDocumentationTests @Test void quartzTriggerDailyTimeInterval() throws Exception { setupTriggerDetails(dailyTimeIntervalTrigger.getTriggerBuilder(), TriggerState.PAUSED); - this.mockMvc.perform(get("/actuator/quartz/triggers/samples/example")) - .andExpect(status().isOk()) - .andDo(document("quartz/trigger-details-daily-time-interval", + assertThat(this.mvc.get().uri("/actuator/quartz/triggers/samples/example")).hasStatusOk() + .apply(document("quartz/trigger-details-daily-time-interval", relaxedResponseFields(fieldWithPath("dailyTimeInterval") .description("Daily time interval trigger specific details.")) .andWithPrefix("dailyTimeInterval.", dailyTimeIntervalTriggerSummary) @@ -391,9 +379,8 @@ class QuartzEndpointDocumentationTests extends MockMvcEndpointDocumentationTests given(trigger.getNextFireTime()).willReturn(fromUtc("2020-12-07T03:00:00Z")); given(this.scheduler.getTriggerState(trigger.getKey())).willReturn(TriggerState.NORMAL); mockTriggers(trigger); - this.mockMvc.perform(get("/actuator/quartz/triggers/samples/example")) - .andExpect(status().isOk()) - .andDo(document("quartz/trigger-details-custom", + assertThat(this.mvc.get().uri("/actuator/quartz/triggers/samples/example")).hasStatusOk() + .apply(document("quartz/trigger-details-custom", relaxedResponseFields(fieldWithPath("custom").description("Custom trigger specific details.")) .andWithPrefix("custom.", customTriggerSummary))); } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/SbomEndpointDocumentationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/SbomEndpointDocumentationTests.java index f427e9f25e..5fb4e5b541 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/SbomEndpointDocumentationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/SbomEndpointDocumentationTests.java @@ -27,10 +27,9 @@ import org.springframework.context.annotation.Import; import org.springframework.core.io.ResourceLoader; import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation; +import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; /** * Tests for generating documentation describing the {@link SbomEndpoint}. @@ -40,18 +39,16 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. class SbomEndpointDocumentationTests extends MockMvcEndpointDocumentationTests { @Test - void sbom() throws Exception { - this.mockMvc.perform(get("/actuator/sbom")) - .andExpect(status().isOk()) - .andDo(MockMvcRestDocumentation.document("sbom", + void sbom() { + assertThat(this.mvc.get().uri("/actuator/sbom")).hasStatusOk() + .apply(MockMvcRestDocumentation.document("sbom", responseFields(fieldWithPath("ids").description("An array of available SBOM ids.")))); } @Test - void sboms() throws Exception { - this.mockMvc.perform(get("/actuator/sbom/application")) - .andExpect(status().isOk()) - .andDo(MockMvcRestDocumentation.document("sbom/id")); + void sboms() { + assertThat(this.mvc.get().uri("/actuator/sbom/application")).hasStatusOk() + .apply(MockMvcRestDocumentation.document("sbom/id")); } @Configuration(proxyBeanMethods = false) diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/ScheduledTasksEndpointDocumentationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/ScheduledTasksEndpointDocumentationTests.java index cd757aa6cd..f195cb3a20 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/ScheduledTasksEndpointDocumentationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/ScheduledTasksEndpointDocumentationTests.java @@ -34,13 +34,12 @@ import org.springframework.scheduling.annotation.Scheduled; import org.springframework.scheduling.annotation.SchedulingConfigurer; import org.springframework.scheduling.config.ScheduledTaskHolder; +import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessResponse; import static org.springframework.restdocs.operation.preprocess.Preprocessors.replacePattern; import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; /** * Tests for generating documentation describing the {@link ScheduledTasksEndpoint}. @@ -50,10 +49,9 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. class ScheduledTasksEndpointDocumentationTests extends MockMvcEndpointDocumentationTests { @Test - void scheduledTasks() throws Exception { - this.mockMvc.perform(get("/actuator/scheduledtasks")) - .andExpect(status().isOk()) - .andDo(document("scheduled-tasks", + void scheduledTasks() { + assertThat(this.mvc.get().uri("/actuator/scheduledtasks")).hasStatusOk() + .apply(document("scheduled-tasks", preprocessResponse(replacePattern( Pattern.compile("org.*\\.ScheduledTasksEndpointDocumentationTests\\$TestConfiguration"), "com.example.Processor")), diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/SessionsEndpointDocumentationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/SessionsEndpointDocumentationTests.java index cfdd12e317..3ff7a813fb 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/SessionsEndpointDocumentationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/SessionsEndpointDocumentationTests.java @@ -30,12 +30,14 @@ import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; +import org.springframework.http.HttpStatus; import org.springframework.restdocs.payload.FieldDescriptor; import org.springframework.session.FindByIndexNameSessionRepository; import org.springframework.session.MapSession; import org.springframework.session.Session; import org.springframework.test.context.TestPropertySource; +import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.BDDMockito.given; import static org.mockito.BDDMockito.then; import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; @@ -43,9 +45,6 @@ import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWit import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName; import static org.springframework.restdocs.request.RequestDocumentation.queryParameters; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; /** * Tests for generating documentation describing the {@link ShutdownEndpoint}. @@ -77,33 +76,31 @@ class SessionsEndpointDocumentationTests extends MockMvcEndpointDocumentationTes private FindByIndexNameSessionRepository sessionRepository; @Test - void sessionsForUsername() throws Exception { + void sessionsForUsername() { Map sessions = new HashMap<>(); sessions.put(sessionOne.getId(), sessionOne); sessions.put(sessionTwo.getId(), sessionTwo); sessions.put(sessionThree.getId(), sessionThree); given(this.sessionRepository.findByPrincipalName("alice")).willReturn(sessions); - this.mockMvc.perform(get("/actuator/sessions").param("username", "alice")) - .andExpect(status().isOk()) - .andDo(document("sessions/username", + assertThat(this.mvc.get().uri("/actuator/sessions").param("username", "alice")).hasStatusOk() + .apply(document("sessions/username", responseFields(fieldWithPath("sessions").description("Sessions for the given username.")) .andWithPrefix("sessions.[].", sessionFields), queryParameters(parameterWithName("username").description("Name of the user.")))); } @Test - void sessionWithId() throws Exception { + void sessionWithId() { given(this.sessionRepository.findById(sessionTwo.getId())).willReturn(sessionTwo); - this.mockMvc.perform(get("/actuator/sessions/{id}", sessionTwo.getId())) - .andExpect(status().isOk()) - .andDo(document("sessions/id", responseFields(sessionFields))); + assertThat(this.mvc.get().uri("/actuator/sessions/{id}", sessionTwo.getId())).hasStatusOk() + .apply(document("sessions/id", responseFields(sessionFields))); } @Test - void deleteASession() throws Exception { - this.mockMvc.perform(delete("/actuator/sessions/{id}", sessionTwo.getId())) - .andExpect(status().isNoContent()) - .andDo(document("sessions/delete")); + void deleteASession() { + assertThat(this.mvc.delete().uri("/actuator/sessions/{id}", sessionTwo.getId())) + .hasStatus(HttpStatus.NO_CONTENT) + .apply(document("sessions/delete")); then(this.sessionRepository).should().deleteById(sessionTwo.getId()); } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/ShutdownEndpointDocumentationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/ShutdownEndpointDocumentationTests.java index 36e5d3fdbf..e2d55c4068 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/ShutdownEndpointDocumentationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/ShutdownEndpointDocumentationTests.java @@ -25,10 +25,9 @@ import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation; +import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; /** * Tests for generating documentation describing the {@link ShutdownEndpoint}. @@ -38,10 +37,9 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. class ShutdownEndpointDocumentationTests extends MockMvcEndpointDocumentationTests { @Test - void shutdown() throws Exception { - this.mockMvc.perform(post("/actuator/shutdown")) - .andExpect(status().isOk()) - .andDo(MockMvcRestDocumentation.document("shutdown", responseFields( + void shutdown() { + assertThat(this.mvc.post().uri("/actuator/shutdown")).hasStatusOk() + .apply(MockMvcRestDocumentation.document("shutdown", responseFields( fieldWithPath("message").description("Message describing the result of the request.")))); } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/StartupEndpointDocumentationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/StartupEndpointDocumentationTests.java index 85e5a6e7a0..28d4f5bd29 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/StartupEndpointDocumentationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/StartupEndpointDocumentationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -30,11 +30,9 @@ import org.springframework.restdocs.payload.FieldDescriptor; import org.springframework.restdocs.payload.JsonFieldType; import org.springframework.restdocs.payload.PayloadDocumentation; +import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; /** * Tests for generating documentation describing {@link StartupEndpoint}. @@ -55,17 +53,15 @@ class StartupEndpointDocumentationTests extends MockMvcEndpointDocumentationTest } @Test - void startupSnapshot() throws Exception { - this.mockMvc.perform(get("/actuator/startup")) - .andExpect(status().isOk()) - .andDo(document("startup-snapshot", PayloadDocumentation.responseFields(responseFields()))); + void startupSnapshot() { + assertThat(this.mvc.get().uri("/actuator/startup")).hasStatusOk() + .apply(document("startup-snapshot", PayloadDocumentation.responseFields(responseFields()))); } @Test - void startup() throws Exception { - this.mockMvc.perform(post("/actuator/startup")) - .andExpect(status().isOk()) - .andDo(document("startup", PayloadDocumentation.responseFields(responseFields()))); + void startup() { + assertThat(this.mvc.post().uri("/actuator/startup")).hasStatusOk() + .apply(document("startup", PayloadDocumentation.responseFields(responseFields()))); } private FieldDescriptor[] responseFields() { diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/ThreadDumpEndpointDocumentationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/ThreadDumpEndpointDocumentationTests.java index afed23b877..d07911d0d0 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/ThreadDumpEndpointDocumentationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/ThreadDumpEndpointDocumentationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -31,12 +31,11 @@ import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation; import org.springframework.restdocs.operation.preprocess.ContentModifyingOperationPreprocessor; import org.springframework.restdocs.payload.JsonFieldType; +import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessResponse; import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; import static org.springframework.restdocs.payload.PayloadDocumentation.subsectionWithPath; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; /** * Tests for generating documentation describing {@link ThreadDumpEndpoint}. @@ -46,7 +45,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. class ThreadDumpEndpointDocumentationTests extends MockMvcEndpointDocumentationTests { @Test - void jsonThreadDump() throws Exception { + void jsonThreadDump() { ReentrantLock lock = new ReentrantLock(); CountDownLatch latch = new CountDownLatch(1); new Thread(() -> { @@ -63,9 +62,8 @@ class ThreadDumpEndpointDocumentationTests extends MockMvcEndpointDocumentationT Thread.currentThread().interrupt(); } }).start(); - this.mockMvc.perform(get("/actuator/threaddump").accept(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) - .andDo(MockMvcRestDocumentation + assertThat(this.mvc.get().uri("/actuator/threaddump").accept(MediaType.APPLICATION_JSON)).hasStatusOk() + .apply(MockMvcRestDocumentation .document("threaddump/json", preprocessResponse(limit("threads")), responseFields( fieldWithPath("threads").description("JVM's threads."), fieldWithPath("threads.[].blockedCount") @@ -178,10 +176,9 @@ class ThreadDumpEndpointDocumentationTests extends MockMvcEndpointDocumentationT } @Test - void textThreadDump() throws Exception { - this.mockMvc.perform(get("/actuator/threaddump").accept(MediaType.TEXT_PLAIN)) - .andExpect(status().isOk()) - .andDo(MockMvcRestDocumentation.document("threaddump/text", + void textThreadDump() { + assertThat(this.mvc.get().uri("/actuator/threaddump").accept(MediaType.TEXT_PLAIN)).hasStatusOk() + .apply(MockMvcRestDocumentation.document("threaddump/text", preprocessResponse(new ContentModifyingOperationPreprocessor((bytes, mediaType) -> { String content = new String(bytes, StandardCharsets.UTF_8); int mainThreadIndex = content.indexOf("\"main\" - Thread"); diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/integrationtest/ControllerEndpointWebMvcIntegrationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/integrationtest/ControllerEndpointWebMvcIntegrationTests.java index 1479292a3e..8658090dc5 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/integrationtest/ControllerEndpointWebMvcIntegrationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/integrationtest/ControllerEndpointWebMvcIntegrationTests.java @@ -37,19 +37,17 @@ import org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguratio import org.springframework.boot.test.util.TestPropertyValues; import org.springframework.boot.web.servlet.context.AnnotationConfigServletWebApplicationContext; import org.springframework.context.annotation.Import; +import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.mock.web.MockServletContext; import org.springframework.security.authentication.TestingAuthenticationToken; import org.springframework.security.test.context.TestSecurityContextHolder; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.setup.DefaultMockMvcBuilder; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.test.web.servlet.assertj.MockMvcTester; import org.springframework.test.web.servlet.setup.MockMvcConfigurer; import org.springframework.web.bind.annotation.GetMapping; +import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; /** * Integration tests for the Actuator's MVC {@link ControllerEndpoint controller @@ -69,16 +67,16 @@ class ControllerEndpointWebMvcIntegrationTests { } @Test - void endpointsAreSecureByDefault() throws Exception { + void endpointsAreSecureByDefault() { this.context = new AnnotationConfigServletWebApplicationContext(); this.context.register(SecureConfiguration.class, ExampleController.class); - MockMvc mockMvc = createSecureMockMvc(); - mockMvc.perform(get("/actuator/example").accept(MediaType.APPLICATION_JSON)) - .andExpect(status().isUnauthorized()); + MockMvcTester mvc = createSecureMockMvcTester(); + assertThat(mvc.get().uri("/actuator/example").accept(MediaType.APPLICATION_JSON)) + .hasStatus(HttpStatus.UNAUTHORIZED); } @Test - void endpointsCanBeAccessed() throws Exception { + void endpointsCanBeAccessed() { TestSecurityContextHolder.getContext() .setAuthentication(new TestingAuthenticationToken("user", "N/A", "ROLE_ACTUATOR")); this.context = new AnnotationConfigServletWebApplicationContext(); @@ -86,22 +84,23 @@ class ControllerEndpointWebMvcIntegrationTests { TestPropertyValues .of("management.endpoints.web.base-path:/management", "management.endpoints.web.exposure.include=*") .applyTo(this.context); - MockMvc mockMvc = createSecureMockMvc(); - mockMvc.perform(get("/management/example")).andExpect(status().isOk()); + MockMvcTester mvc = createSecureMockMvcTester(); + assertThat(mvc.get().uri("/management/example")).hasStatusOk(); } - private MockMvc createSecureMockMvc() { - return doCreateMockMvc(springSecurity()); + private MockMvcTester createSecureMockMvcTester() { + return doCreateMockMvcTester(springSecurity()); } - private MockMvc doCreateMockMvc(MockMvcConfigurer... configurers) { + private MockMvcTester doCreateMockMvcTester(MockMvcConfigurer... configurers) { this.context.setServletContext(new MockServletContext()); this.context.refresh(); - DefaultMockMvcBuilder builder = MockMvcBuilders.webAppContextSetup(this.context); - for (MockMvcConfigurer configurer : configurers) { - builder.apply(configurer); - } - return builder.build(); + return MockMvcTester.from(this.context, (builder) -> { + for (MockMvcConfigurer configurer : configurers) { + builder.apply(configurer); + } + return builder.build(); + }); } @ImportAutoConfiguration({ JacksonAutoConfiguration.class, HttpMessageConvertersAutoConfiguration.class, diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/integrationtest/WebMvcEndpointCorsIntegrationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/integrationtest/WebMvcEndpointCorsIntegrationTests.java index 9a0ee8a1b4..1cfc54744a 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/integrationtest/WebMvcEndpointCorsIntegrationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/integrationtest/WebMvcEndpointCorsIntegrationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,6 +16,7 @@ package org.springframework.boot.actuate.autoconfigure.integrationtest; +import org.assertj.core.api.ThrowingConsumer; import org.junit.jupiter.api.Test; import org.springframework.boot.actuate.autoconfigure.beans.BeansEndpointAutoConfiguration; @@ -32,14 +33,12 @@ import org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguratio import org.springframework.boot.test.context.runner.ContextConsumer; import org.springframework.boot.test.context.runner.WebApplicationContextRunner; import org.springframework.http.HttpHeaders; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.ResultActions; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.http.HttpStatus; +import org.springframework.test.web.servlet.assertj.MockMvcTester; +import org.springframework.test.web.servlet.assertj.MvcTestResult; import org.springframework.web.context.WebApplicationContext; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.options; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.assertj.core.api.Assertions.assertThat; /** * Integration tests for the MVC actuator endpoints' CORS support @@ -60,21 +59,22 @@ class WebMvcEndpointCorsIntegrationTests { @Test void corsIsDisabledByDefault() { - this.contextRunner.run(withMockMvc((mockMvc) -> mockMvc - .perform(options("/actuator/beans").header("Origin", "foo.example.com") - .header(HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD, "GET")) - .andExpect(header().doesNotExist(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN)))); + this.contextRunner.run(withMockMvc((mvc) -> assertThat(mvc.options() + .uri("/actuator/beans") + .header("Origin", "foo.example.com") + .header(HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD, "GET")) + .doesNotContainHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN))); } @Test void settingAllowedOriginsEnablesCors() { this.contextRunner.withPropertyValues("management.endpoints.web.cors.allowed-origins:foo.example.com") - .run(withMockMvc((mockMvc) -> { - mockMvc - .perform(options("/actuator/beans").header("Origin", "bar.example.com") - .header(HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD, "GET")) - .andExpect(status().isForbidden()); - performAcceptedCorsRequest(mockMvc); + .run(withMockMvc((mvc) -> { + assertThat(mvc.options() + .uri("/actuator/beans") + .header("Origin", "bar.example.com") + .header(HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD, "GET")).hasStatus(HttpStatus.FORBIDDEN); + performAcceptedCorsRequest(mvc); })); } @@ -83,20 +83,22 @@ class WebMvcEndpointCorsIntegrationTests { this.contextRunner .withPropertyValues("management.endpoints.web.cors.allowed-origin-patterns:*.example.com", "management.endpoints.web.cors.allow-credentials:true") - .run(withMockMvc((mockMvc) -> { - mockMvc - .perform(options("/actuator/beans").header("Origin", "bar.example.org") - .header(HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD, "GET")) - .andExpect(status().isForbidden()); - performAcceptedCorsRequest(mockMvc); + .run(withMockMvc((mvc) -> { + assertThat(mvc.options() + .uri("/actuator/beans") + .header("Origin", "bar.example.org") + .header(HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD, "GET")).hasStatus(HttpStatus.FORBIDDEN); + performAcceptedCorsRequest(mvc); })); } @Test void maxAgeDefaultsTo30Minutes() { this.contextRunner.withPropertyValues("management.endpoints.web.cors.allowed-origins:foo.example.com") - .run(withMockMvc((mockMvc) -> performAcceptedCorsRequest(mockMvc) - .andExpect(header().string(HttpHeaders.ACCESS_CONTROL_MAX_AGE, "1800")))); + .run(withMockMvc((mvc) -> { + MvcTestResult result = performAcceptedCorsRequest(mvc); + assertThat(result).hasHeader(HttpHeaders.ACCESS_CONTROL_MAX_AGE, "1800"); + })); } @Test @@ -104,20 +106,20 @@ class WebMvcEndpointCorsIntegrationTests { this.contextRunner .withPropertyValues("management.endpoints.web.cors.allowed-origins:foo.example.com", "management.endpoints.web.cors.max-age: 2400") - .run(withMockMvc((mockMvc) -> performAcceptedCorsRequest(mockMvc) - .andExpect(header().string(HttpHeaders.ACCESS_CONTROL_MAX_AGE, "2400")))); + .run(withMockMvc((mvc) -> { + MvcTestResult result = performAcceptedCorsRequest(mvc); + assertThat(result).hasHeader(HttpHeaders.ACCESS_CONTROL_MAX_AGE, "2400"); + })); } @Test void requestsWithDisallowedHeadersAreRejected() { this.contextRunner.withPropertyValues("management.endpoints.web.cors.allowed-origins:foo.example.com") - .run(withMockMvc((mockMvc) -> - - mockMvc - .perform(options("/actuator/beans").header("Origin", "foo.example.com") - .header(HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD, "GET") - .header(HttpHeaders.ACCESS_CONTROL_REQUEST_HEADERS, "Alpha")) - .andExpect(status().isForbidden()))); + .run(withMockMvc((mvc) -> assertThat(mvc.options() + .uri("/actuator/beans") + .header("Origin", "foo.example.com") + .header(HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD, "GET") + .header(HttpHeaders.ACCESS_CONTROL_REQUEST_HEADERS, "Alpha")).hasStatus(HttpStatus.FORBIDDEN))); } @Test @@ -125,21 +127,22 @@ class WebMvcEndpointCorsIntegrationTests { this.contextRunner .withPropertyValues("management.endpoints.web.cors.allowed-origins:foo.example.com", "management.endpoints.web.cors.allowed-headers:Alpha,Bravo") - .run(withMockMvc((mockMvc) -> mockMvc - .perform(options("/actuator/beans").header("Origin", "foo.example.com") - .header(HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD, "GET") - .header(HttpHeaders.ACCESS_CONTROL_REQUEST_HEADERS, "Alpha")) - .andExpect(status().isOk()) - .andExpect(header().string(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS, "Alpha")))); + .run(withMockMvc((mvc) -> assertThat(mvc.options() + .uri("/actuator/beans") + .header("Origin", "foo.example.com") + .header(HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD, "GET") + .header(HttpHeaders.ACCESS_CONTROL_REQUEST_HEADERS, "Alpha")).hasStatusOk() + .headers() + .hasValue(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS, "Alpha"))); } @Test void requestsWithDisallowedMethodsAreRejected() { this.contextRunner.withPropertyValues("management.endpoints.web.cors.allowed-origins:foo.example.com") - .run(withMockMvc((mockMvc) -> mockMvc - .perform(options("/actuator/beans").header(HttpHeaders.ORIGIN, "foo.example.com") - .header(HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD, "PATCH")) - .andExpect(status().isForbidden()))); + .run(withMockMvc((mvc) -> assertThat(mvc.options() + .uri("/actuator/beans") + .header(HttpHeaders.ORIGIN, "foo.example.com") + .header(HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD, "PATCH")).hasStatus(HttpStatus.FORBIDDEN))); } @Test @@ -147,11 +150,12 @@ class WebMvcEndpointCorsIntegrationTests { this.contextRunner .withPropertyValues("management.endpoints.web.cors.allowed-origins:foo.example.com", "management.endpoints.web.cors.allowed-methods:GET,HEAD") - .run(withMockMvc((mockMvc) -> mockMvc - .perform(options("/actuator/beans").header(HttpHeaders.ORIGIN, "foo.example.com") - .header(HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD, "HEAD")) - .andExpect(status().isOk()) - .andExpect(header().string(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, "GET,HEAD")))); + .run(withMockMvc((mvc) -> assertThat(mvc.options() + .uri("/actuator/beans") + .header(HttpHeaders.ORIGIN, "foo.example.com") + .header(HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD, "HEAD")).hasStatusOk() + .headers() + .hasValue(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, "GET,HEAD"))); } @Test @@ -159,8 +163,10 @@ class WebMvcEndpointCorsIntegrationTests { this.contextRunner .withPropertyValues("management.endpoints.web.cors.allowed-origins:foo.example.com", "management.endpoints.web.cors.allow-credentials:true") - .run(withMockMvc((mockMvc) -> performAcceptedCorsRequest(mockMvc) - .andExpect(header().string(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS, "true")))); + .run(withMockMvc((mvc) -> { + MvcTestResult result = performAcceptedCorsRequest(mvc); + assertThat(result).hasHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS, "true"); + })); } @Test @@ -168,31 +174,28 @@ class WebMvcEndpointCorsIntegrationTests { this.contextRunner .withPropertyValues("management.endpoints.web.cors.allowed-origins:foo.example.com", "management.endpoints.web.cors.allow-credentials:false") - .run(withMockMvc((mockMvc) -> performAcceptedCorsRequest(mockMvc) - .andExpect(header().doesNotExist(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS)))); + .run(withMockMvc((mvc) -> { + MvcTestResult result = performAcceptedCorsRequest(mvc); + assertThat(result).doesNotContainHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS); + })); } - private ContextConsumer withMockMvc(MockMvcConsumer mockMvc) { - return (context) -> mockMvc.accept(MockMvcBuilders.webAppContextSetup(context).build()); + private ContextConsumer withMockMvc(ThrowingConsumer mvc) { + return (context) -> mvc.accept(MockMvcTester.from(context)); } - private ResultActions performAcceptedCorsRequest(MockMvc mockMvc) throws Exception { - return performAcceptedCorsRequest(mockMvc, "/actuator/beans"); + private MvcTestResult performAcceptedCorsRequest(MockMvcTester mvc) { + return performAcceptedCorsRequest(mvc, "/actuator/beans"); } - private ResultActions performAcceptedCorsRequest(MockMvc mockMvc, String url) throws Exception { - return mockMvc - .perform(options(url).header(HttpHeaders.ORIGIN, "foo.example.com") - .header(HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD, "GET")) - .andExpect(header().string(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, "foo.example.com")) - .andExpect(status().isOk()); - } - - @FunctionalInterface - interface MockMvcConsumer { - - void accept(MockMvc mockMvc) throws Exception; - + private MvcTestResult performAcceptedCorsRequest(MockMvcTester mvc, String url) { + MvcTestResult result = mvc.options() + .uri(url) + .header(HttpHeaders.ORIGIN, "foo.example.com") + .header(HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD, "GET") + .exchange(); + assertThat(result).hasStatusOk().hasHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, "foo.example.com"); + return result; } } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/integrationtest/WebMvcEndpointIntegrationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/integrationtest/WebMvcEndpointIntegrationTests.java index 9e297c3b0f..fd376a1bff 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/integrationtest/WebMvcEndpointIntegrationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/integrationtest/WebMvcEndpointIntegrationTests.java @@ -47,24 +47,17 @@ import org.springframework.boot.web.servlet.context.AnnotationConfigServletWebAp import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; +import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.mock.web.MockServletContext; import org.springframework.security.authentication.TestingAuthenticationToken; import org.springframework.security.test.context.TestSecurityContextHolder; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.MvcResult; -import org.springframework.test.web.servlet.setup.DefaultMockMvcBuilder; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.test.web.servlet.assertj.MockMvcTester; import org.springframework.test.web.servlet.setup.MockMvcConfigurer; import org.springframework.web.util.pattern.PathPatternParser; import static org.assertj.core.api.Assertions.assertThat; -import static org.hamcrest.Matchers.both; -import static org.hamcrest.Matchers.hasKey; import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; /** * Integration tests for the Actuator's MVC endpoints. @@ -92,25 +85,26 @@ class WebMvcEndpointIntegrationTests { } @Test - void endpointsAreSecureByDefault() throws Exception { + void endpointsAreSecureByDefault() { this.context = new AnnotationConfigServletWebApplicationContext(); this.context.register(SecureConfiguration.class); - MockMvc mockMvc = createSecureMockMvc(); - mockMvc.perform(get("/actuator/beans").accept(MediaType.APPLICATION_JSON)).andExpect(status().isUnauthorized()); + MockMvcTester mvc = createSecureMockMvcTester(); + assertThat(mvc.get().uri("/actuator/beans").accept(MediaType.APPLICATION_JSON)) + .hasStatus(HttpStatus.UNAUTHORIZED); } @Test - void endpointsAreSecureByDefaultWithCustomBasePath() throws Exception { + void endpointsAreSecureByDefaultWithCustomBasePath() { this.context = new AnnotationConfigServletWebApplicationContext(); this.context.register(SecureConfiguration.class); TestPropertyValues.of("management.endpoints.web.base-path:/management").applyTo(this.context); - MockMvc mockMvc = createSecureMockMvc(); - mockMvc.perform(get("/management/beans").accept(MediaType.APPLICATION_JSON)) - .andExpect(status().isUnauthorized()); + MockMvcTester mvc = createSecureMockMvcTester(); + assertThat(mvc.get().uri("/management/beans").accept(MediaType.APPLICATION_JSON)) + .hasStatus(HttpStatus.UNAUTHORIZED); } @Test - void endpointsAreSecureWithActuatorRoleWithCustomBasePath() throws Exception { + void endpointsAreSecureWithActuatorRoleWithCustomBasePath() { TestSecurityContextHolder.getContext() .setAuthentication(new TestingAuthenticationToken("user", "N/A", "ROLE_ACTUATOR")); this.context = new AnnotationConfigServletWebApplicationContext(); @@ -118,55 +112,54 @@ class WebMvcEndpointIntegrationTests { TestPropertyValues .of("management.endpoints.web.base-path:/management", "management.endpoints.web.exposure.include=*") .applyTo(this.context); - MockMvc mockMvc = createSecureMockMvc(); - mockMvc.perform(get("/management/beans")).andExpect(status().isOk()); + MockMvcTester mvc = createSecureMockMvcTester(); + assertThat(mvc.get().uri("/management/beans")).hasStatusOk(); } @Test - void linksAreProvidedToAllEndpointTypes() throws Exception { + void linksAreProvidedToAllEndpointTypes() { this.context = new AnnotationConfigServletWebApplicationContext(); this.context.register(DefaultConfiguration.class, EndpointsConfiguration.class); TestPropertyValues.of("management.endpoints.web.exposure.include=*").applyTo(this.context); - MockMvc mockMvc = doCreateMockMvc(); - mockMvc.perform(get("/actuator").accept("*/*")) - .andExpect(status().isOk()) - .andExpect(jsonPath("_links", - both(hasKey("beans")).and(hasKey("servlet")) - .and(hasKey("restcontroller")) - .and(hasKey("controller")))); + MockMvcTester mvc = doCreateMockMvcTester(); + assertThat(mvc.get().uri("/actuator").accept("*/*")).hasStatusOk() + .bodyJson() + .extractingPath("_links") + .asMap() + .containsKeys("beans", "servlet", "restcontroller", "controller"); } @Test - void linksPageIsNotAvailableWhenDisabled() throws Exception { + void linksPageIsNotAvailableWhenDisabled() { this.context = new AnnotationConfigServletWebApplicationContext(); this.context.register(DefaultConfiguration.class, EndpointsConfiguration.class); TestPropertyValues.of("management.endpoints.web.discovery.enabled=false").applyTo(this.context); - MockMvc mockMvc = doCreateMockMvc(); - mockMvc.perform(get("/actuator").accept("*/*")).andExpect(status().isNotFound()); + MockMvcTester mvc = doCreateMockMvcTester(); + assertThat(mvc.get().uri("/actuator").accept("*/*")).hasStatus(HttpStatus.NOT_FOUND); } @Test - void endpointObjectMapperCanBeApplied() throws Exception { + void endpointObjectMapperCanBeApplied() { this.context = new AnnotationConfigServletWebApplicationContext(); this.context.register(EndpointObjectMapperConfiguration.class, DefaultConfiguration.class); TestPropertyValues.of("management.endpoints.web.exposure.include=*").applyTo(this.context); - MockMvc mockMvc = doCreateMockMvc(); - MvcResult result = mockMvc.perform(get("/actuator/beans")).andExpect(status().isOk()).andReturn(); - assertThat(result.getResponse().getContentAsString()).contains("\"scope\":\"notelgnis\""); + MockMvcTester mvc = doCreateMockMvcTester(); + assertThat(mvc.get().uri("/actuator/beans")).hasStatusOk().bodyText().contains("\"scope\":\"notelgnis\""); } - private MockMvc createSecureMockMvc() { - return doCreateMockMvc(springSecurity()); + private MockMvcTester createSecureMockMvcTester() { + return doCreateMockMvcTester(springSecurity()); } - private MockMvc doCreateMockMvc(MockMvcConfigurer... configurers) { + private MockMvcTester doCreateMockMvcTester(MockMvcConfigurer... configurers) { this.context.setServletContext(new MockServletContext()); this.context.refresh(); - DefaultMockMvcBuilder builder = MockMvcBuilders.webAppContextSetup(this.context); - for (MockMvcConfigurer configurer : configurers) { - builder.apply(configurer); - } - return builder.build(); + return MockMvcTester.from(this.context, (builder) -> { + for (MockMvcConfigurer configurer : configurers) { + builder.apply(configurer); + } + return builder.build(); + }); } @ImportAutoConfiguration({ JacksonAutoConfiguration.class, HttpMessageConvertersAutoConfiguration.class, diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/observation/web/servlet/WebMvcObservationAutoConfigurationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/observation/web/servlet/WebMvcObservationAutoConfigurationTests.java index 3fd1a2b61b..847b5882d7 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/observation/web/servlet/WebMvcObservationAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/observation/web/servlet/WebMvcObservationAutoConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -40,14 +40,11 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.Ordered; import org.springframework.http.server.observation.DefaultServerRequestObservationConvention; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.test.web.servlet.assertj.MockMvcTester; import org.springframework.web.filter.ServerHttpObservationFilter; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; /** * Tests for {@link WebMvcObservationAutoConfiguration}. @@ -173,14 +170,13 @@ class WebMvcObservationAutoConfigurationTests { return getInitializedMeterRegistry(context, "/test0", "/test1", "/test2"); } - private MeterRegistry getInitializedMeterRegistry(AssertableWebApplicationContext context, String... urls) - throws Exception { + private MeterRegistry getInitializedMeterRegistry(AssertableWebApplicationContext context, String... urls) { assertThat(context).hasSingleBean(FilterRegistrationBean.class); Filter filter = context.getBean(FilterRegistrationBean.class).getFilter(); assertThat(filter).isInstanceOf(ServerHttpObservationFilter.class); - MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(context).addFilters(filter).build(); + MockMvcTester mvc = MockMvcTester.from(context, (builder) -> builder.addFilters(filter).build()); for (String url : urls) { - mockMvc.perform(MockMvcRequestBuilders.get(url)).andExpect(status().isOk()); + assertThat(mvc.get().uri(url)).hasStatusOk(); } return context.getBean(MeterRegistry.class); } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/graphql/security/GraphQlWebMvcSecurityAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/graphql/security/GraphQlWebMvcSecurityAutoConfigurationTests.java index 6a0abd80b9..809668c190 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/graphql/security/GraphQlWebMvcSecurityAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/graphql/security/GraphQlWebMvcSecurityAutoConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2020-2024 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,6 +17,7 @@ package org.springframework.boot.autoconfigure.graphql.security; import graphql.schema.idl.TypeRuntimeWiring; +import org.assertj.core.api.ThrowingConsumer; import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.AutoConfigurations; @@ -46,17 +47,13 @@ import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.provisioning.InMemoryUserDetailsManager; import org.springframework.security.web.DefaultSecurityFilterChain; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.test.web.servlet.assertj.MockMvcTester; import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.security.config.Customizer.withDefaults; import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.user; import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; /** * Tests for {@link GraphQlWebMvcSecurityAutoConfiguration}. @@ -81,46 +78,46 @@ class GraphQlWebMvcSecurityAutoConfigurationTests { @Test void anonymousUserShouldBeUnauthorized() { - testWith((mockMvc) -> { + withMockMvc((mvc) -> { String query = "{ bookById(id: \\\"book-1\\\"){ id name pageCount author }}"; - mockMvc.perform(post("/graphql").content("{\"query\": \"" + query + "\"}")) - .andExpect(status().isOk()) - .andExpect(content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON)) - .andExpect(jsonPath("data.bookById.name").doesNotExist()) - .andExpect(jsonPath("errors[0].extensions.classification").value(ErrorType.UNAUTHORIZED.toString())); + assertThat(mvc.post().uri("/graphql").content("{\"query\": \"" + query + "\"}")).satisfies((result) -> { + assertThat(result).hasStatusOk().hasContentTypeCompatibleWith(MediaType.APPLICATION_JSON); + assertThat(result).bodyJson() + .doesNotHavePath("data.bookById.name") + .extractingPath("errors[0].extensions.classification") + .asString() + .isEqualTo(ErrorType.UNAUTHORIZED.toString()); + }); }); } @Test void authenticatedUserShouldGetData() { - testWith((mockMvc) -> { + withMockMvc((mvc) -> { String query = "{ bookById(id: \\\"book-1\\\"){ id name pageCount author }}"; - mockMvc.perform(post("/graphql").content("{\"query\": \"" + query + "\"}").with(user("rob"))) - .andExpect(status().isOk()) - .andExpect(content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON)) - .andExpect(jsonPath("data.bookById.name").value("GraphQL for beginners")) - .andExpect(jsonPath("errors").doesNotExist()); + assertThat(mvc.post().uri("/graphql").content("{\"query\": \"" + query + "\"}").with(user("rob"))) + .satisfies((result) -> { + assertThat(result).hasStatusOk().hasContentTypeCompatibleWith(MediaType.APPLICATION_JSON); + assertThat(result).bodyJson() + .doesNotHavePath("errors") + .extractingPath("data.bookById.name") + .asString() + .isEqualTo("GraphQL for beginners"); + }); }); - } - private void testWith(MockMvcConsumer mockMvcConsumer) { + private void withMockMvc(ThrowingConsumer mvc) { this.contextRunner.run((context) -> { MediaType mediaType = MediaType.APPLICATION_JSON; - MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(context) - .defaultRequest(post("/graphql").contentType(mediaType).accept(mediaType)) - .apply(springSecurity()) - .build(); - mockMvcConsumer.accept(mockMvc); + MockMvcTester mockMVc = MockMvcTester.from(context, + (builder) -> builder.defaultRequest(post("/graphql").contentType(mediaType).accept(mediaType)) + .apply(springSecurity()) + .build()); + mvc.accept(mockMVc); }); } - private interface MockMvcConsumer { - - void accept(MockMvc mockMvc) throws Exception; - - } - @Configuration(proxyBeanMethods = false) static class DataFetchersConfiguration { diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/graphql/servlet/GraphQlWebMvcAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/graphql/servlet/GraphQlWebMvcAutoConfigurationTests.java index 85418adef9..260f122c14 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/graphql/servlet/GraphQlWebMvcAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/graphql/servlet/GraphQlWebMvcAutoConfigurationTests.java @@ -17,10 +17,11 @@ package org.springframework.boot.autoconfigure.graphql.servlet; import java.time.Duration; +import java.util.List; import java.util.Map; import graphql.schema.idl.TypeRuntimeWiring; -import org.hamcrest.Matchers; +import org.assertj.core.api.ThrowingConsumer; import org.junit.jupiter.api.Test; import org.springframework.aot.hint.RuntimeHints; @@ -42,9 +43,9 @@ import org.springframework.graphql.server.WebGraphQlInterceptor; import org.springframework.graphql.server.webmvc.GraphQlHttpHandler; import org.springframework.graphql.server.webmvc.GraphQlWebSocketHandler; import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.test.web.servlet.assertj.MockMvcTester; import org.springframework.web.servlet.HandlerMapping; import org.springframework.web.servlet.function.RouterFunction; import org.springframework.web.servlet.function.support.RouterFunctionMapping; @@ -52,13 +53,7 @@ import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandl import org.springframework.web.socket.server.support.WebSocketHandlerMapping; import static org.assertj.core.api.Assertions.assertThat; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.redirectedUrl; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; /** * Tests for {@link GraphQlWebMvcAutoConfiguration}. @@ -85,93 +80,100 @@ class GraphQlWebMvcAutoConfigurationTests { @Test void simpleQueryShouldWork() { - testWith((mockMvc) -> { + withMockMvc((mvc) -> { String query = "{ bookById(id: \\\"book-1\\\"){ id name pageCount author } }"; - mockMvc.perform(post("/graphql").content("{\"query\": \"" + query + "\"}")) - .andExpect(status().isOk()) - .andExpect(content().contentTypeCompatibleWith(MediaType.APPLICATION_GRAPHQL_RESPONSE)) - .andExpect(jsonPath("data.bookById.name").value("GraphQL for beginners")); + assertThat(mvc.post().uri("/graphql").content("{\"query\": \"" + query + "\"}")).satisfies((result) -> { + assertThat(result).hasStatusOk().hasContentTypeCompatibleWith(MediaType.APPLICATION_GRAPHQL_RESPONSE); + assertThat(result).bodyJson() + .extractingPath("data.bookById.name") + .asString() + .isEqualTo("GraphQL for beginners"); + }); }); } @Test void SseSubscriptionShouldWork() { - testWith((mockMvc) -> { + withMockMvc((mvc) -> { String query = "{ booksOnSale(minPages: 50){ id name pageCount author } }"; - mockMvc - .perform(post("/graphql").accept(MediaType.TEXT_EVENT_STREAM) - .content("{\"query\": \"subscription TestSubscription " + query + "\"}")) - .andExpect(status().isOk()) - .andExpect(content().contentTypeCompatibleWith(MediaType.TEXT_EVENT_STREAM)) - .andExpect(content().string(Matchers.stringContainsInOrder("event:next", - "data:{\"data\":{\"booksOnSale\":{\"id\":\"book-1\",\"name\":\"GraphQL for beginners\",\"pageCount\":100,\"author\":\"John GraphQL\"}}}", - "event:next", - "data:{\"data\":{\"booksOnSale\":{\"id\":\"book-2\",\"name\":\"Harry Potter and the Philosopher's Stone\",\"pageCount\":223,\"author\":\"Joanne Rowling\"}}}"))); + assertThat(mvc.post() + .uri("/graphql") + .accept(MediaType.TEXT_EVENT_STREAM) + .content("{\"query\": \"subscription TestSubscription " + query + "\"}")).satisfies((result) -> { + assertThat(result).hasStatusOk().hasContentTypeCompatibleWith(MediaType.TEXT_EVENT_STREAM); + assertThat(result).bodyText() + .containsSubsequence("event:next", + "data:{\"data\":{\"booksOnSale\":{\"id\":\"book-1\",\"name\":\"GraphQL for beginners\",\"pageCount\":100,\"author\":\"John GraphQL\"}}}", + "event:next", + "data:{\"data\":{\"booksOnSale\":{\"id\":\"book-2\",\"name\":\"Harry Potter and the Philosopher's Stone\",\"pageCount\":223,\"author\":\"Joanne Rowling\"}}}"); + }); }); } @Test void httpGetQueryShouldBeSupported() { - testWith((mockMvc) -> { + withMockMvc((mvc) -> { String query = "{ bookById(id: \\\"book-1\\\"){ id name pageCount author } }"; - mockMvc.perform(get("/graphql?query={query}", "{\"query\": \"" + query + "\"}")) - .andExpect(status().isMethodNotAllowed()) - .andExpect(header().string("Allow", "POST")); + assertThat(mvc.get().uri("/graphql?query={query}", "{\"query\": \"" + query + "\"}")) + .hasStatus(HttpStatus.METHOD_NOT_ALLOWED) + .headers() + .hasValue("Allow", "POST"); }); } @Test void shouldRejectMissingQuery() { - testWith((mockMvc) -> mockMvc.perform(post("/graphql").content("{}")).andExpect(status().isBadRequest())); + withMockMvc((mvc) -> assertThat(mvc.post().uri("/graphql").content("{}")).hasStatus(HttpStatus.BAD_REQUEST)); } @Test void shouldRejectQueryWithInvalidJson() { - testWith((mockMvc) -> mockMvc.perform(post("/graphql").content(":)")).andExpect(status().isBadRequest())); + withMockMvc((mvc) -> assertThat(mvc.post().uri("/graphql").content(":)")).hasStatus(HttpStatus.BAD_REQUEST)); } @Test void shouldConfigureWebInterceptors() { - testWith((mockMvc) -> { + withMockMvc((mvc) -> { String query = "{ bookById(id: \\\"book-1\\\"){ id name pageCount author } }"; - mockMvc.perform(post("/graphql").content("{\"query\": \"" + query + "\"}")) - .andExpect(status().isOk()) - .andExpect(header().string("X-Custom-Header", "42")); + assertThat(mvc.post().uri("/graphql").content("{\"query\": \"" + query + "\"}")).hasStatusOk() + .headers() + .hasValue("X-Custom-Header", "42"); }); } @Test void shouldExposeSchemaEndpoint() { - testWith((mockMvc) -> mockMvc.perform(get("/graphql/schema")) - .andExpect(status().isOk()) - .andExpect(content().contentType(MediaType.TEXT_PLAIN)) - .andExpect(content().string(Matchers.containsString("type Book")))); + withMockMvc((mvc) -> assertThat(mvc.get().uri("/graphql/schema")).hasStatusOk() + .hasContentType(MediaType.TEXT_PLAIN) + .bodyText() + .contains("type Book")); } @Test void shouldExposeGraphiqlEndpoint() { - testWith((mockMvc) -> { - mockMvc.perform(get("/graphiql")) - .andExpect(status().is3xxRedirection()) - .andExpect(redirectedUrl("http://localhost/graphiql?path=/graphql")); - mockMvc.perform(get("/graphiql?path=/graphql")) - .andExpect(status().isOk()) - .andExpect(content().contentType(MediaType.TEXT_HTML)); + withMockMvc((mvc) -> { + assertThat(mvc.get().uri("/graphiql")).hasStatus3xxRedirection() + .hasRedirectedUrl("http://localhost/graphiql?path=/graphql"); + assertThat(mvc.get().uri("/graphiql?path=/graphql")).hasStatusOk() + .contentType() + .isEqualTo(MediaType.TEXT_HTML); }); } @Test void shouldSupportCors() { - testWith((mockMvc) -> { + withMockMvc((mvc) -> { String query = "{" + " bookById(id: \\\"book-1\\\"){ " + " id" + " name" + " pageCount" + " author" + " }" + "}"; - mockMvc - .perform(post("/graphql").header(HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD, "POST") - .header(HttpHeaders.ORIGIN, "https://example.com") - .content("{\"query\": \"" + query + "\"}")) - .andExpect(status().isOk()) - .andExpect(header().stringValues(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, "https://example.com")) - .andExpect(header().stringValues(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS, "true")); + assertThat(mvc.post() + .uri("/graphql") + .header(HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD, "POST") + .header(HttpHeaders.ORIGIN, "https://example.com") + .content("{\"query\": \"" + query + "\"}")) + .satisfies((result) -> assertThat(result).hasStatusOk() + .headers() + .containsEntry(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, List.of("https://example.com")) + .containsEntry(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS, List.of("true"))); }); } @@ -217,22 +219,17 @@ class GraphQlWebMvcAutoConfigurationTests { assertThat(RuntimeHintsPredicates.resource().forResource("graphiql/index.html")).accepts(hints); } - private void testWith(MockMvcConsumer mockMvcConsumer) { + private void withMockMvc(ThrowingConsumer mvc) { this.contextRunner.run((context) -> { - MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(context) - .defaultRequest(post("/graphql").contentType(MediaType.APPLICATION_JSON) - .accept(MediaType.APPLICATION_GRAPHQL_RESPONSE)) - .build(); - mockMvcConsumer.accept(mockMvc); + MockMvcTester mockMVc = MockMvcTester.from(context, + (builder) -> builder + .defaultRequest(post("/graphql").contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_GRAPHQL_RESPONSE)) + .build()); + mvc.accept(mockMVc); }); } - private interface MockMvcConsumer { - - void accept(MockMvc mockMvc) throws Exception; - - } - @Configuration(proxyBeanMethods = false) static class DataFetchersConfiguration { diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/WelcomePageHandlerMappingTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/WelcomePageHandlerMappingTests.java index 96462cf037..52397e4e4e 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/WelcomePageHandlerMappingTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/WelcomePageHandlerMappingTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,6 +21,7 @@ import java.util.Map; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; +import org.assertj.core.api.ThrowingConsumer; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -30,6 +31,8 @@ import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration; import org.springframework.boot.autoconfigure.template.TemplateAvailabilityProvider; import org.springframework.boot.autoconfigure.template.TemplateAvailabilityProviders; +import org.springframework.boot.test.context.assertj.AssertableWebApplicationContext; +import org.springframework.boot.test.context.runner.ContextConsumer; import org.springframework.boot.test.context.runner.WebApplicationContextRunner; import org.springframework.boot.test.system.CapturedOutput; import org.springframework.boot.test.system.OutputCaptureExtension; @@ -39,18 +42,14 @@ import org.springframework.context.annotation.Configuration; import org.springframework.core.io.FileSystemResource; import org.springframework.core.io.Resource; import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.test.web.servlet.assertj.MockMvcTester; import org.springframework.web.servlet.ViewResolver; import org.springframework.web.servlet.view.AbstractView; import org.springframework.web.servlet.view.InternalResourceView; import static org.assertj.core.api.Assertions.assertThat; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.forwardedUrl; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; /** * Tests for {@link WelcomePageHandlerMapping}. @@ -76,50 +75,35 @@ class WelcomePageHandlerMappingTests { @Test void handlesRequestForStaticPageThatAcceptsTextHtml() { this.contextRunner.withUserConfiguration(StaticResourceConfiguration.class) - .run((context) -> MockMvcBuilders.webAppContextSetup(context) - .build() - .perform(get("/").accept(MediaType.TEXT_HTML)) - .andExpect(status().isOk()) - .andExpect(forwardedUrl("index.html"))); + .run(testWith((mvc) -> assertThat(mvc.get().uri("/").accept(MediaType.TEXT_HTML)).hasStatusOk() + .hasForwardedUrl("index.html"))); } @Test void handlesRequestForStaticPageThatAcceptsAll() { this.contextRunner.withUserConfiguration(StaticResourceConfiguration.class) - .run((context) -> MockMvcBuilders.webAppContextSetup(context) - .build() - .perform(get("/").accept(MediaType.ALL)) - .andExpect(status().isOk()) - .andExpect(forwardedUrl("index.html"))); + .run(testWith((mvc) -> assertThat(mvc.get().uri("/").accept(MediaType.ALL)).hasStatusOk() + .hasForwardedUrl("index.html"))); } @Test void doesNotHandleRequestThatDoesNotAcceptTextHtml() { this.contextRunner.withUserConfiguration(StaticResourceConfiguration.class) - .run((context) -> MockMvcBuilders.webAppContextSetup(context) - .build() - .perform(get("/").accept(MediaType.APPLICATION_JSON)) - .andExpect(status().isNotFound())); + .run(testWith((mvc) -> assertThat(mvc.get().uri("/").accept(MediaType.APPLICATION_JSON)) + .hasStatus(HttpStatus.NOT_FOUND))); } @Test void handlesRequestWithNoAcceptHeader() { this.contextRunner.withUserConfiguration(StaticResourceConfiguration.class) - .run((context) -> MockMvcBuilders.webAppContextSetup(context) - .build() - .perform(get("/")) - .andExpect(status().isOk()) - .andExpect(forwardedUrl("index.html"))); + .run(testWith((mvc) -> assertThat(mvc.get().uri("/")).hasStatusOk().hasForwardedUrl("index.html"))); } @Test void handlesRequestWithEmptyAcceptHeader() { this.contextRunner.withUserConfiguration(StaticResourceConfiguration.class) - .run((context) -> MockMvcBuilders.webAppContextSetup(context) - .build() - .perform(get("/").header(HttpHeaders.ACCEPT, "")) - .andExpect(status().isOk()) - .andExpect(forwardedUrl("index.html"))); + .run(testWith((mvc) -> assertThat(mvc.get().uri("/").header(HttpHeaders.ACCEPT, "")).hasStatusOk() + .hasForwardedUrl("index.html"))); } @Test @@ -131,54 +115,43 @@ class WelcomePageHandlerMappingTests { @Test void producesNotFoundResponseWhenThereIsNoWelcomePage() { - this.contextRunner.run((context) -> MockMvcBuilders.webAppContextSetup(context) - .build() - .perform(get("/").accept(MediaType.TEXT_HTML)) - .andExpect(status().isNotFound())); + this.contextRunner.run(testWith( + (mvc) -> assertThat(mvc.get().uri("/").accept(MediaType.TEXT_HTML)).hasStatus(HttpStatus.NOT_FOUND))); } @Test void handlesRequestForTemplateThatAcceptsTextHtml() { - this.contextRunner.withUserConfiguration(TemplateConfiguration.class).run((context) -> { - MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(context).build(); - mockMvc.perform(get("/").accept(MediaType.TEXT_HTML)) - .andExpect(status().isOk()) - .andExpect(content().string("index template")); - }); + this.contextRunner.withUserConfiguration(TemplateConfiguration.class) + .run(testWith((mvc) -> assertThat(mvc.get().uri("/").accept(MediaType.TEXT_HTML)).hasStatusOk() + .hasBodyTextEqualTo("index template"))); } @Test void handlesRequestForTemplateThatAcceptsAll() { - this.contextRunner.withUserConfiguration(TemplateConfiguration.class).run((context) -> { - MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(context).build(); - mockMvc.perform(get("/").accept(MediaType.ALL)) - .andExpect(status().isOk()) - .andExpect(content().string("index template")); - }); + this.contextRunner.withUserConfiguration(TemplateConfiguration.class) + .run(testWith((mvc) -> assertThat(mvc.get().uri("/").accept(MediaType.ALL)).hasStatusOk() + .hasBodyTextEqualTo("index template"))); } @Test void prefersAStaticResourceToATemplate() { this.contextRunner.withUserConfiguration(StaticResourceConfiguration.class, TemplateConfiguration.class) - .run((context) -> { - MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(context).build(); - mockMvc.perform(get("/").accept(MediaType.ALL)) - .andExpect(status().isOk()) - .andExpect(forwardedUrl("index.html")); - }); + .run(testWith((mvc) -> assertThat(mvc.get().uri("/").accept(MediaType.ALL)).hasStatusOk() + .hasForwardedUrl("index.html"))); } @Test void logsInvalidAcceptHeader(CapturedOutput output) { - this.contextRunner.withUserConfiguration(TemplateConfiguration.class).run((context) -> { - MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(context).build(); - mockMvc.perform(get("/").accept("*/*q=0.8")) - .andExpect(status().isOk()) - .andExpect(content().string("index template")); - }); + this.contextRunner.withUserConfiguration(TemplateConfiguration.class) + .run(testWith((mvc) -> assertThat(mvc.get().uri("/").accept("*/*q=0.8")).hasStatusOk() + .hasBodyTextEqualTo("index template"))); assertThat(output).contains("Received invalid Accept header. Assuming all media types are accepted"); } + private ContextConsumer testWith(ThrowingConsumer mvc) { + return (context) -> mvc.accept(MockMvcTester.from(context)); + } + @Configuration(proxyBeanMethods = false) static class HandlerMappingConfiguration { diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/WelcomePageNotAcceptableHandlerMappingTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/WelcomePageNotAcceptableHandlerMappingTests.java index 3011f29b4a..ec3feab084 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/WelcomePageNotAcceptableHandlerMappingTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/WelcomePageNotAcceptableHandlerMappingTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,6 +16,7 @@ package org.springframework.boot.autoconfigure.web.servlet; +import org.assertj.core.api.ThrowingConsumer; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.ObjectProvider; @@ -23,6 +24,8 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration; import org.springframework.boot.autoconfigure.template.TemplateAvailabilityProviders; +import org.springframework.boot.test.context.assertj.AssertableWebApplicationContext; +import org.springframework.boot.test.context.runner.ContextConsumer; import org.springframework.boot.test.context.runner.WebApplicationContextRunner; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; @@ -31,14 +34,13 @@ import org.springframework.core.Ordered; import org.springframework.core.io.FileSystemResource; import org.springframework.core.io.Resource; import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.test.util.ReflectionTestUtils; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.test.web.servlet.assertj.MockMvcTester; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import static org.assertj.core.api.Assertions.assertThat; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; /** * Tests for {@link WelcomePageNotAcceptableHandlerMapping}. @@ -66,37 +68,28 @@ class WelcomePageNotAcceptableHandlerMappingTests { @Test void handlesRequestForStaticPageThatAcceptsTextHtml() { this.contextRunner.withUserConfiguration(StaticResourceConfiguration.class) - .run((context) -> MockMvcBuilders.webAppContextSetup(context) - .build() - .perform(get("/").accept(MediaType.TEXT_HTML)) - .andExpect(status().isNotAcceptable())); + .run(testWith((mvc) -> assertThat(mvc.get().uri("/").accept(MediaType.TEXT_HTML)) + .hasStatus(HttpStatus.NOT_ACCEPTABLE))); } @Test - void handlesRequestForStaticPagetThatDoesNotAcceptTextHtml() { + void handlesRequestForStaticPageThatDoesNotAcceptTextHtml() { this.contextRunner.withUserConfiguration(StaticResourceConfiguration.class) - .run((context) -> MockMvcBuilders.webAppContextSetup(context) - .build() - .perform(get("/").accept(MediaType.APPLICATION_JSON)) - .andExpect(status().isNotAcceptable())); + .run(testWith((mvc) -> assertThat(mvc.get().uri("/").accept(MediaType.APPLICATION_JSON)) + .hasStatus(HttpStatus.NOT_ACCEPTABLE))); } @Test void handlesRequestWithNoAcceptHeader() { this.contextRunner.withUserConfiguration(StaticResourceConfiguration.class) - .run((context) -> MockMvcBuilders.webAppContextSetup(context) - .build() - .perform(get("/")) - .andExpect(status().isNotAcceptable())); + .run(testWith((mvc) -> assertThat(mvc.get().uri("/")).hasStatus(HttpStatus.NOT_ACCEPTABLE))); } @Test void handlesRequestWithEmptyAcceptHeader() { this.contextRunner.withUserConfiguration(StaticResourceConfiguration.class) - .run((context) -> MockMvcBuilders.webAppContextSetup(context) - .build() - .perform(get("/").header(HttpHeaders.ACCEPT, "")) - .andExpect(status().isNotAcceptable())); + .run(testWith((mvc) -> assertThat(mvc.get().uri("/").header(HttpHeaders.ACCEPT, "")) + .hasStatus(HttpStatus.NOT_ACCEPTABLE))); } @Test @@ -109,10 +102,12 @@ class WelcomePageNotAcceptableHandlerMappingTests { @Test void producesNotFoundResponseWhenThereIsNoWelcomePage() { - this.contextRunner.run((context) -> MockMvcBuilders.webAppContextSetup(context) - .build() - .perform(get("/").accept(MediaType.TEXT_HTML)) - .andExpect(status().isNotFound())); + this.contextRunner.run(testWith( + (mvc) -> assertThat(mvc.get().uri("/").accept(MediaType.TEXT_HTML)).hasStatus(HttpStatus.NOT_FOUND))); + } + + private ContextConsumer testWith(ThrowingConsumer mvc) { + return (context) -> mvc.accept(MockMvcTester.from(context)); } @Configuration(proxyBeanMethods = false) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/error/BasicErrorControllerDirectMockMvcTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/error/BasicErrorControllerDirectMockMvcTests.java index 4f4d67968f..b09718bbea 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/error/BasicErrorControllerDirectMockMvcTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/error/BasicErrorControllerDirectMockMvcTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -42,19 +42,14 @@ import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.EnableAspectJAutoProxy; import org.springframework.context.annotation.Import; import org.springframework.http.MediaType; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.MvcResult; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.test.web.servlet.assertj.MockMvcTester; import org.springframework.web.context.ConfigurableWebApplicationContext; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatExceptionOfType; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; /** - * Tests for {@link BasicErrorController} using {@link MockMvc} but not + * Tests for {@link BasicErrorController} using {@link MockMvcTester} but not * {@link org.springframework.test.context.junit.jupiter.SpringExtension}. * * @author Dave Syer @@ -64,7 +59,7 @@ class BasicErrorControllerDirectMockMvcTests { private ConfigurableWebApplicationContext wac; - private MockMvc mockMvc; + private MockMvcTester mvc; @AfterEach void close() { @@ -73,49 +68,44 @@ class BasicErrorControllerDirectMockMvcTests { void setup(ConfigurableWebApplicationContext context) { this.wac = context; - this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build(); + this.mvc = MockMvcTester.from(this.wac); } @Test - void errorPageAvailableWithParentContext() throws Exception { + void errorPageAvailableWithParentContext() { setup((ConfigurableWebApplicationContext) new SpringApplicationBuilder(ParentConfiguration.class) .child(ChildConfiguration.class) .run("--server.port=0")); - MvcResult response = this.mockMvc.perform(get("/error").accept(MediaType.TEXT_HTML)) - .andExpect(status().is5xxServerError()) - .andReturn(); - String content = response.getResponse().getContentAsString(); - assertThat(content).contains("status=999"); + assertThat(this.mvc.get().uri("/error").accept(MediaType.TEXT_HTML)).hasStatus5xxServerError() + .bodyText() + .contains("status=999"); } @Test - void errorPageAvailableWithMvcIncluded() throws Exception { + void errorPageAvailableWithMvcIncluded() { setup((ConfigurableWebApplicationContext) new SpringApplication(WebMvcIncludedConfiguration.class) .run("--server.port=0")); - MvcResult response = this.mockMvc.perform(get("/error").accept(MediaType.TEXT_HTML)) - .andExpect(status().is5xxServerError()) - .andReturn(); - String content = response.getResponse().getContentAsString(); - assertThat(content).contains("status=999"); + assertThat(this.mvc.get().uri("/error").accept(MediaType.TEXT_HTML)).hasStatus5xxServerError() + .bodyText() + .contains("status=999"); } @Test void errorPageNotAvailableWithWhitelabelDisabled() { setup((ConfigurableWebApplicationContext) new SpringApplication(WebMvcIncludedConfiguration.class) .run("--server.port=0", "--server.error.whitelabel.enabled=false")); - assertThatExceptionOfType(ServletException.class) - .isThrownBy(() -> this.mockMvc.perform(get("/error").accept(MediaType.TEXT_HTML))); + assertThat(this.mvc.get().uri("/error").accept(MediaType.TEXT_HTML)).hasFailed() + .failure() + .isInstanceOf(ServletException.class); } @Test - void errorControllerWithAop() throws Exception { + void errorControllerWithAop() { setup((ConfigurableWebApplicationContext) new SpringApplication(WithAopConfiguration.class) .run("--server.port=0")); - MvcResult response = this.mockMvc.perform(get("/error").accept(MediaType.TEXT_HTML)) - .andExpect(status().is5xxServerError()) - .andReturn(); - String content = response.getResponse().getContentAsString(); - assertThat(content).contains("status=999"); + assertThat(this.mvc.get().uri("/error").accept(MediaType.TEXT_HTML)).hasStatus5xxServerError() + .bodyText() + .contains("status=999"); } @Target(ElementType.TYPE) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/error/BasicErrorControllerMockMvcTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/error/BasicErrorControllerMockMvcTests.java index 31eb0cb5fc..beda7a4a53 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/error/BasicErrorControllerMockMvcTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/error/BasicErrorControllerMockMvcTests.java @@ -47,10 +47,10 @@ import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.MvcResult; import org.springframework.test.web.servlet.RequestBuilder; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.test.web.servlet.assertj.MockMvcTester; +import org.springframework.test.web.servlet.assertj.MvcTestResult; import org.springframework.util.ReflectionUtils; import org.springframework.validation.BindException; import org.springframework.web.bind.MethodArgumentNotValidException; @@ -63,11 +63,9 @@ import org.springframework.web.servlet.View; import org.springframework.web.servlet.view.AbstractView; import static org.assertj.core.api.Assertions.assertThat; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; /** - * Tests for {@link BasicErrorController} using {@link MockMvc} and + * Tests for {@link BasicErrorController} using {@link MockMvcTester} and * {@link SpringBootTest @SpringBootTest}. * * @author Dave Syer @@ -80,60 +78,51 @@ class BasicErrorControllerMockMvcTests { @Autowired private WebApplicationContext wac; - private MockMvc mockMvc; + private MockMvcTester mvc; @BeforeEach void setup() { - this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build(); + this.mvc = MockMvcTester.from(this.wac); } @Test - void testDirectAccessForMachineClient() throws Exception { - MvcResult response = this.mockMvc.perform(get("/error")).andExpect(status().is5xxServerError()).andReturn(); - String content = response.getResponse().getContentAsString(); - assertThat(content).contains("999"); + void testDirectAccessForMachineClient() { + assertThat(this.mvc.get().uri("/error")).hasStatus5xxServerError().bodyText().contains("999"); } @Test - void testErrorWithNotFoundResponseStatus() throws Exception { - MvcResult result = this.mockMvc.perform(get("/bang")).andExpect(status().isNotFound()).andReturn(); - MvcResult response = this.mockMvc.perform(new ErrorDispatcher(result, "/error")).andReturn(); - String content = response.getResponse().getContentAsString(); - assertThat(content).contains("Expected!"); + void testErrorWithNotFoundResponseStatus() { + assertThat(this.mvc.get().uri("/bang")).hasStatus(HttpStatus.NOT_FOUND) + .satisfies((result) -> assertThat(this.mvc.perform(new ErrorDispatcher(result, "/error"))).bodyText() + .contains("Expected!")); + } @Test - void testErrorWithNoContentResponseStatus() throws Exception { - MvcResult result = this.mockMvc.perform(get("/noContent").accept("some/thing")) - .andExpect(status().isNoContent()) - .andReturn(); - MvcResult response = this.mockMvc.perform(new ErrorDispatcher(result, "/error")) - .andExpect(status().isNoContent()) - .andReturn(); - String content = response.getResponse().getContentAsString(); - assertThat(content).isEmpty(); + void testErrorWithNoContentResponseStatus() { + assertThat(this.mvc.get().uri("/noContent").accept("some/thing")).hasStatus(HttpStatus.NO_CONTENT) + .satisfies((result) -> assertThat(this.mvc.perform(new ErrorDispatcher(result, "/error"))) + .hasStatus(HttpStatus.NO_CONTENT) + .body() + .isEmpty()); } @Test - void testBindingExceptionForMachineClient() throws Exception { + void testBindingExceptionForMachineClient() { // In a real server the response is carried over into the error dispatcher, but - // in the mock a new one is created so we have to assert the status at this - // intermediate point - MvcResult result = this.mockMvc.perform(get("/bind")).andExpect(status().is4xxClientError()).andReturn(); - MvcResult response = this.mockMvc.perform(new ErrorDispatcher(result, "/error")).andReturn(); - // And the rendered status code is always wrong (but would be 400 in a real - // system) - String content = response.getResponse().getContentAsString(); - assertThat(content).contains("Validation failed"); + // in the mock a new one is created, so we have to assert the status at this + // intermediate point, and the rendered status code is always wrong (but would + // be 400 in a real system) + assertThat(this.mvc.get().uri("/bind")).hasStatus4xxClientError() + .satisfies((result) -> assertThat(this.mvc.perform(new ErrorDispatcher(result, "/error"))).bodyText() + .contains("Validation failed")); } @Test - void testDirectAccessForBrowserClient() throws Exception { - MvcResult response = this.mockMvc.perform(get("/error").accept(MediaType.TEXT_HTML)) - .andExpect(status().is5xxServerError()) - .andReturn(); - String content = response.getResponse().getContentAsString(); - assertThat(content).contains("ERROR_BEAN"); + void testDirectAccessForBrowserClient() { + assertThat(this.mvc.get().uri("/error").accept(MediaType.TEXT_HTML)).hasStatus5xxServerError() + .bodyText() + .contains("ERROR_BEAN"); } @Target(ElementType.TYPE) @@ -225,8 +214,8 @@ class BasicErrorControllerMockMvcTests { private final String path; - ErrorDispatcher(MvcResult result, String path) { - this.result = result; + ErrorDispatcher(MvcTestResult mvcTestResult, String path) { + this.result = mvcTestResult.getMvcResult(); this.path = path; } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/error/DefaultErrorViewIntegrationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/error/DefaultErrorViewIntegrationTests.java index 3732a81fe9..10212b89b3 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/error/DefaultErrorViewIntegrationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/error/DefaultErrorViewIntegrationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -37,14 +37,10 @@ import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import org.springframework.http.MediaType; import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.MvcResult; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.test.web.servlet.assertj.MockMvcTester; import org.springframework.web.context.WebApplicationContext; import static org.assertj.core.api.Assertions.assertThat; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; /** * Integration tests for the default error view. @@ -59,49 +55,38 @@ class DefaultErrorViewIntegrationTests { @Autowired private WebApplicationContext wac; - private MockMvc mockMvc; + private MockMvcTester mvc; @BeforeEach void setup() { - this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build(); + this.mvc = MockMvcTester.from(this.wac); } @Test - void testErrorForBrowserClient() throws Exception { - MvcResult response = this.mockMvc.perform(get("/error").accept(MediaType.TEXT_HTML)) - .andExpect(status().is5xxServerError()) - .andReturn(); - String content = response.getResponse().getContentAsString(); - assertThat(content).contains(""); - assertThat(content).contains("999"); + void testErrorForBrowserClient() { + assertThat(this.mvc.get().uri("/error").accept(MediaType.TEXT_HTML)).hasStatus5xxServerError() + .bodyText() + .contains("", "999"); } @Test - void testErrorWithHtmlEscape() throws Exception { - MvcResult response = this.mockMvc - .perform( - get("/error") - .requestAttr("jakarta.servlet.error.exception", - new RuntimeException("")) - .accept(MediaType.TEXT_HTML)) - .andExpect(status().is5xxServerError()) - .andReturn(); - String content = response.getResponse().getContentAsString(); - assertThat(content).contains("<script>"); - assertThat(content).contains("Hello World"); - assertThat(content).contains("999"); + void testErrorWithHtmlEscape() { + assertThat(this.mvc.get() + .uri("/error") + .requestAttr("jakarta.servlet.error.exception", + new RuntimeException("")) + .accept(MediaType.TEXT_HTML)).hasStatus5xxServerError() + .bodyText() + .contains("<script>", "Hello World", "999"); } @Test - void testErrorWithSpelEscape() throws Exception { + void testErrorWithSpelEscape() { String spel = "${T(" + getClass().getName() + ").injectCall()}"; - MvcResult response = this.mockMvc - .perform(get("/error").requestAttr("jakarta.servlet.error.exception", new RuntimeException(spel)) - .accept(MediaType.TEXT_HTML)) - .andExpect(status().is5xxServerError()) - .andReturn(); - String content = response.getResponse().getContentAsString(); - assertThat(content).doesNotContain("injection"); + assertThat(this.mvc.get() + .uri("/error") + .requestAttr("jakarta.servlet.error.exception", new RuntimeException(spel)) + .accept(MediaType.TEXT_HTML)).hasStatus5xxServerError().bodyText().doesNotContain("injection"); } static String injectCall() { diff --git a/spring-boot-project/spring-boot-devtools/src/test/java/org/springframework/boot/devtools/autoconfigure/RemoteDevToolsAutoConfigurationTests.java b/spring-boot-project/spring-boot-devtools/src/test/java/org/springframework/boot/devtools/autoconfigure/RemoteDevToolsAutoConfigurationTests.java index 47c523c8e6..73744602f3 100644 --- a/spring-boot-project/spring-boot-devtools/src/test/java/org/springframework/boot/devtools/autoconfigure/RemoteDevToolsAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-devtools/src/test/java/org/springframework/boot/devtools/autoconfigure/RemoteDevToolsAutoConfigurationTests.java @@ -36,6 +36,7 @@ import org.springframework.boot.test.util.TestPropertyValues; import org.springframework.boot.web.servlet.context.AnnotationConfigServletWebApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpStatus; import org.springframework.http.server.ServerHttpRequest; import org.springframework.http.server.ServerHttpResponse; import org.springframework.mock.web.MockFilterChain; @@ -43,15 +44,12 @@ import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletResponse; import org.springframework.mock.web.MockServletContext; import org.springframework.security.config.BeanIds; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.test.web.servlet.assertj.MockMvcTester; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; import static org.mockito.Mockito.mock; import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; /** * Tests for {@link RemoteDevToolsAutoConfiguration}. @@ -150,14 +148,10 @@ class RemoteDevToolsAutoConfigurationTests { void securityConfigurationShouldAllowAccess() throws Exception { this.context = getContext(() -> loadContext("spring.devtools.remote.secret:supersecret")); DispatcherFilter filter = this.context.getBean(DispatcherFilter.class); - MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(this.context) - .apply(springSecurity()) - .addFilter(filter) - .build(); - mockMvc - .perform(MockMvcRequestBuilders.get(DEFAULT_CONTEXT_PATH + "/restart") - .header(DEFAULT_SECRET_HEADER_NAME, "supersecret")) - .andExpect(status().isOk()); + MockMvcTester mvc = MockMvcTester.from(this.context, + (builder) -> builder.apply(springSecurity()).addFilter(filter).build()); + assertThat(mvc.get().uri(DEFAULT_CONTEXT_PATH + "/restart").header(DEFAULT_SECRET_HEADER_NAME, "supersecret")) + .hasStatusOk(); assertRestartInvoked(true); assertThat(this.context.containsBean("devtoolsSecurityFilterChain")).isTrue(); } @@ -167,14 +161,10 @@ class RemoteDevToolsAutoConfigurationTests { this.context = getContext(() -> loadContext("spring.devtools.remote.secret:supersecret", "server.servlet.context-path:/test", "spring.devtools.remote.context-path:/custom")); DispatcherFilter filter = this.context.getBean(DispatcherFilter.class); - MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(this.context) - .apply(springSecurity()) - .addFilter(filter) - .build(); - mockMvc - .perform(MockMvcRequestBuilders.get("/test/custom/restart") - .header(DEFAULT_SECRET_HEADER_NAME, "supersecret")) - .andExpect(status().isOk()); + MockMvcTester mvc = MockMvcTester.from(this.context, + (builder) -> builder.apply(springSecurity()).addFilter(filter).build()); + assertThat(mvc.get().uri("/test/custom/restart").header(DEFAULT_SECRET_HEADER_NAME, "supersecret")) + .hasStatusOk(); assertRestartInvoked(true); } @@ -183,11 +173,9 @@ class RemoteDevToolsAutoConfigurationTests { this.context = getContext(() -> loadContext("spring.devtools.remote.secret:supersecret")); DispatcherFilter filter = this.context.getBean(DispatcherFilter.class); Filter securityFilterChain = this.context.getBean(BeanIds.SPRING_SECURITY_FILTER_CHAIN, Filter.class); - MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(this.context) - .addFilter(securityFilterChain) - .addFilter(filter) - .build(); - mockMvc.perform(MockMvcRequestBuilders.get("/my-path")).andExpect(status().isUnauthorized()); + MockMvcTester mvc = MockMvcTester.from(this.context, + (builder) -> builder.addFilter(securityFilterChain).addFilter(filter).build()); + assertThat(mvc.get().uri("/my-path")).hasStatus(HttpStatus.UNAUTHORIZED); } @Test diff --git a/spring-boot-project/spring-boot-docs/src/main/java/org/springframework/boot/docs/howto/testing/withspringsecurity/MySecurityTests.java b/spring-boot-project/spring-boot-docs/src/main/java/org/springframework/boot/docs/howto/testing/withspringsecurity/MySecurityTests.java index b932490b8a..312a29e5e6 100644 --- a/spring-boot-project/spring-boot-docs/src/main/java/org/springframework/boot/docs/howto/testing/withspringsecurity/MySecurityTests.java +++ b/spring-boot-project/spring-boot-docs/src/main/java/org/springframework/boot/docs/howto/testing/withspringsecurity/MySecurityTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2021 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,20 +21,20 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.security.test.context.support.WithMockUser; -import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.assertj.MockMvcTester; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.assertj.core.api.Assertions.assertThat; @WebMvcTest(UserController.class) class MySecurityTests { @Autowired - private MockMvc mvc; + private MockMvcTester mvc; @Test @WithMockUser(roles = "ADMIN") - void requestProtectedUrlWithUser() throws Exception { - this.mvc.perform(get("/")); + void requestProtectedUrlWithUser() { + assertThat(this.mvc.get().uri("/")).doesNotHaveFailed(); } } diff --git a/spring-boot-project/spring-boot-docs/src/main/java/org/springframework/boot/docs/testing/springbootapplications/autoconfiguredspringrestdocs/withmockmvc/hamcrest/MyUserDocumentationTests.java b/spring-boot-project/spring-boot-docs/src/main/java/org/springframework/boot/docs/testing/springbootapplications/autoconfiguredspringrestdocs/withmockmvc/hamcrest/MyUserDocumentationTests.java index 2c17338ff0..3865123bf2 100644 --- a/spring-boot-project/spring-boot-docs/src/main/java/org/springframework/boot/docs/testing/springbootapplications/autoconfiguredspringrestdocs/withmockmvc/hamcrest/MyUserDocumentationTests.java +++ b/spring-boot-project/spring-boot-docs/src/main/java/org/springframework/boot/docs/testing/springbootapplications/autoconfiguredspringrestdocs/withmockmvc/hamcrest/MyUserDocumentationTests.java @@ -22,24 +22,22 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.http.MediaType; -import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.assertj.MockMvcTester; +import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @WebMvcTest(UserController.class) @AutoConfigureRestDocs class MyUserDocumentationTests { @Autowired - private MockMvc mvc; + private MockMvcTester mvc; @Test - void listUsers() throws Exception { - this.mvc.perform(get("/users").accept(MediaType.TEXT_PLAIN)) - .andExpect(status().isOk()) - .andDo(document("list-users")); + void listUsers() { + assertThat(this.mvc.get().uri("/users").accept(MediaType.TEXT_PLAIN)).hasStatusOk() + .apply(document("list-users")); } } diff --git a/spring-boot-project/spring-boot-docs/src/main/kotlin/org/springframework/boot/docs/features/testing/springbootapplications/autoconfiguredspringrestdocs/withmockmvc/MyUserDocumentationTests.kt b/spring-boot-project/spring-boot-docs/src/main/kotlin/org/springframework/boot/docs/features/testing/springbootapplications/autoconfiguredspringrestdocs/withmockmvc/MyUserDocumentationTests.kt index 3bdd188515..ec5916b9d5 100644 --- a/spring-boot-project/spring-boot-docs/src/main/kotlin/org/springframework/boot/docs/features/testing/springbootapplications/autoconfiguredspringrestdocs/withmockmvc/MyUserDocumentationTests.kt +++ b/spring-boot-project/spring-boot-docs/src/main/kotlin/org/springframework/boot/docs/features/testing/springbootapplications/autoconfiguredspringrestdocs/withmockmvc/MyUserDocumentationTests.kt @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,25 +16,23 @@ package org.springframework.boot.docs.features.testing.springbootapplications.autoconfiguredspringrestdocs.withmockmvc +import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest import org.springframework.http.MediaType import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation -import org.springframework.test.web.servlet.MockMvc -import org.springframework.test.web.servlet.request.MockMvcRequestBuilders -import org.springframework.test.web.servlet.result.MockMvcResultMatchers +import org.springframework.test.web.servlet.assertj.MockMvcTester @WebMvcTest(UserController::class) @AutoConfigureRestDocs -class MyUserDocumentationTests(@Autowired val mvc: MockMvc) { +class MyUserDocumentationTests(@Autowired val mvc: MockMvcTester) { @Test fun listUsers() { - mvc.perform(MockMvcRequestBuilders.get("/users").accept(MediaType.TEXT_PLAIN)) - .andExpect(MockMvcResultMatchers.status().isOk) - .andDo(MockMvcRestDocumentation.document("list-users")) + assertThat(mvc.get().uri("/users").accept(MediaType.TEXT_PLAIN)) + .hasStatusOk().apply(MockMvcRestDocumentation.document("list-users")) } } \ No newline at end of file diff --git a/spring-boot-project/spring-boot-docs/src/main/kotlin/org/springframework/boot/docs/features/testing/springbootapplications/springmvctests/MyControllerTests.kt b/spring-boot-project/spring-boot-docs/src/main/kotlin/org/springframework/boot/docs/features/testing/springbootapplications/springmvctests/MyControllerTests.kt index 9879efc62a..c6889e6958 100644 --- a/spring-boot-project/spring-boot-docs/src/main/kotlin/org/springframework/boot/docs/features/testing/springbootapplications/springmvctests/MyControllerTests.kt +++ b/spring-boot-project/spring-boot-docs/src/main/kotlin/org/springframework/boot/docs/features/testing/springbootapplications/springmvctests/MyControllerTests.kt @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,18 +16,17 @@ package org.springframework.boot.docs.features.testing.springbootapplications.springmvctests +import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test import org.mockito.BDDMockito.given import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest import org.springframework.boot.test.mock.mockito.MockBean import org.springframework.http.MediaType -import org.springframework.test.web.servlet.MockMvc -import org.springframework.test.web.servlet.request.MockMvcRequestBuilders -import org.springframework.test.web.servlet.result.MockMvcResultMatchers +import org.springframework.test.web.servlet.assertj.MockMvcTester @WebMvcTest(UserVehicleController::class) -class MyControllerTests(@Autowired val mvc: MockMvc) { +class MyControllerTests(@Autowired val mvc: MockMvcTester) { @MockBean lateinit var userVehicleService: UserVehicleService @@ -35,10 +34,9 @@ class MyControllerTests(@Autowired val mvc: MockMvc) { @Test fun testExample() { given(userVehicleService.getVehicleDetails("sboot")) - .willReturn(VehicleDetails("Honda", "Civic")) - mvc.perform(MockMvcRequestBuilders.get("/sboot/vehicle").accept(MediaType.TEXT_PLAIN)) - .andExpect(MockMvcResultMatchers.status().isOk) - .andExpect(MockMvcResultMatchers.content().string("Honda Civic")) + .willReturn(VehicleDetails("Honda", "Civic")) + assertThat(mvc.get().uri("/sboot/vehicle").accept(MediaType.TEXT_PLAIN)) + .hasStatusOk().hasBodyTextEqualTo("Honda Civic") } } diff --git a/spring-boot-project/spring-boot-docs/src/main/kotlin/org/springframework/boot/docs/features/testing/springbootapplications/withmockenvironment/MyMockMvcTests.kt b/spring-boot-project/spring-boot-docs/src/main/kotlin/org/springframework/boot/docs/features/testing/springbootapplications/withmockenvironment/MyMockMvcTests.kt index 10e10bae2f..4a64a4b046 100644 --- a/spring-boot-project/spring-boot-docs/src/main/kotlin/org/springframework/boot/docs/features/testing/springbootapplications/withmockenvironment/MyMockMvcTests.kt +++ b/spring-boot-project/spring-boot-docs/src/main/kotlin/org/springframework/boot/docs/features/testing/springbootapplications/withmockenvironment/MyMockMvcTests.kt @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,24 +16,23 @@ package org.springframework.boot.docs.features.testing.springbootapplications.withmockenvironment +import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc import org.springframework.boot.test.context.SpringBootTest import org.springframework.test.web.reactive.server.WebTestClient import org.springframework.test.web.reactive.server.expectBody -import org.springframework.test.web.servlet.MockMvc -import org.springframework.test.web.servlet.request.MockMvcRequestBuilders -import org.springframework.test.web.servlet.result.MockMvcResultMatchers +import org.springframework.test.web.servlet.assertj.MockMvcTester @SpringBootTest @AutoConfigureMockMvc class MyMockMvcTests { @Test - fun testWithMockMvc(@Autowired mvc: MockMvc) { - mvc.perform(MockMvcRequestBuilders.get("/")).andExpect(MockMvcResultMatchers.status().isOk) - .andExpect(MockMvcResultMatchers.content().string("Hello World")) + fun testWithMockMvc(@Autowired mvc: MockMvcTester) { + assertThat(mvc.get().uri("/")).hasStatusOk() + .hasBodyTextEqualTo("Hello World") } // If Spring WebFlux is on the classpath, you can drive MVC tests with a WebTestClient @@ -41,10 +40,10 @@ class MyMockMvcTests { @Test fun testWithWebTestClient(@Autowired webClient: WebTestClient) { webClient - .get().uri("/") - .exchange() - .expectStatus().isOk - .expectBody().isEqualTo("Hello World") + .get().uri("/") + .exchange() + .expectStatus().isOk + .expectBody().isEqualTo("Hello World") } } diff --git a/spring-boot-project/spring-boot-docs/src/main/kotlin/org/springframework/boot/docs/howto/testing/withspringsecurity/MySecurityTests.kt b/spring-boot-project/spring-boot-docs/src/main/kotlin/org/springframework/boot/docs/howto/testing/withspringsecurity/MySecurityTests.kt index efbb12d120..43bfd36fcc 100644 --- a/spring-boot-project/spring-boot-docs/src/main/kotlin/org/springframework/boot/docs/howto/testing/withspringsecurity/MySecurityTests.kt +++ b/spring-boot-project/spring-boot-docs/src/main/kotlin/org/springframework/boot/docs/howto/testing/withspringsecurity/MySecurityTests.kt @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,20 +16,21 @@ package org.springframework.boot.docs.howto.testing.withspringsecurity +import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest import org.springframework.security.test.context.support.WithMockUser -import org.springframework.test.web.servlet.MockMvc -import org.springframework.test.web.servlet.request.MockMvcRequestBuilders +import org.springframework.test.web.servlet.assertj.MockMvcTester @WebMvcTest(UserController::class) -class MySecurityTests(@Autowired val mvc: MockMvc) { +class MySecurityTests(@Autowired val mvc: MockMvcTester) { @Test @WithMockUser(roles = ["ADMIN"]) fun requestProtectedUrlWithUser() { - mvc.perform(MockMvcRequestBuilders.get("/")) + assertThat(mvc.get().uri("/")) + .doesNotHaveFailed() } } diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/restdocs/MockMvcRestDocsAutoConfigurationAdvancedConfigurationIntegrationTests.java b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/restdocs/MockMvcRestDocsAutoConfigurationAdvancedConfigurationIntegrationTests.java index c543a3e2ec..8a01e8dc7f 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/restdocs/MockMvcRestDocsAutoConfigurationAdvancedConfigurationIntegrationTests.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/restdocs/MockMvcRestDocsAutoConfigurationAdvancedConfigurationIntegrationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -30,7 +30,7 @@ import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation; import org.springframework.restdocs.mockmvc.RestDocumentationResultHandler; import org.springframework.restdocs.templates.TemplateFormats; import org.springframework.security.test.context.support.WithMockUser; -import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.assertj.MockMvcTester; import org.springframework.util.FileSystemUtils; import static org.assertj.core.api.Assertions.assertThat; @@ -39,7 +39,6 @@ import static org.springframework.restdocs.hypermedia.HypermediaDocumentation.li import static org.springframework.restdocs.hypermedia.HypermediaDocumentation.links; import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; /** * Integration tests for advanced configuration of @@ -54,7 +53,7 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilder class MockMvcRestDocsAutoConfigurationAdvancedConfigurationIntegrationTests { @Autowired - private MockMvc mvc; + private MockMvcTester mvc; @Autowired private RestDocumentationResultHandler documentationHandler; @@ -68,10 +67,9 @@ class MockMvcRestDocsAutoConfigurationAdvancedConfigurationIntegrationTests { } @Test - void snippetGeneration() throws Exception { - this.mvc.perform(get("/")) - .andDo(this.documentationHandler - .document(links(linkWithRel("self").description("Canonical location of this resource")))); + void snippetGeneration() { + assertThat(this.mvc.get().uri("/")).apply(this.documentationHandler + .document(links(linkWithRel("self").description("Canonical location of this resource")))); File defaultSnippetsDir = new File(this.generatedSnippets, "snippet-generation"); assertThat(defaultSnippetsDir).exists(); assertThat(contentOf(new File(defaultSnippetsDir, "curl-request.md"))).contains("'http://localhost:8080/'"); diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/restdocs/MockMvcRestDocsAutoConfigurationIntegrationTests.java b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/restdocs/MockMvcRestDocsAutoConfigurationIntegrationTests.java index 94523a8f65..50c7a6acca 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/restdocs/MockMvcRestDocsAutoConfigurationIntegrationTests.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/restdocs/MockMvcRestDocsAutoConfigurationIntegrationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,13 +24,12 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.testsupport.BuildOutput; -import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.assertj.MockMvcTester; import org.springframework.util.FileSystemUtils; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.contentOf; import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; /** * Integration tests for {@link RestDocsAutoConfiguration} with Mock MVC. @@ -42,7 +41,7 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilder class MockMvcRestDocsAutoConfigurationIntegrationTests { @Autowired - private MockMvc mvc; + private MockMvcTester mvc; private File generatedSnippets; @@ -53,8 +52,8 @@ class MockMvcRestDocsAutoConfigurationIntegrationTests { } @Test - void defaultSnippetsAreWritten() throws Exception { - this.mvc.perform(get("/")).andDo(document("default-snippets")); + void defaultSnippetsAreWritten() { + assertThat(this.mvc.get().uri("/")).apply(document("default-snippets")); File defaultSnippetsDir = new File(this.generatedSnippets, "default-snippets"); assertThat(defaultSnippetsDir).exists(); assertThat(contentOf(new File(defaultSnippetsDir, "curl-request.adoc"))).contains("'https://api.example.com/'"); diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/security/MockMvcSecurityIntegrationTests.java b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/security/MockMvcSecurityIntegrationTests.java index cc93138f82..05a94e8913 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/security/MockMvcSecurityIntegrationTests.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/security/MockMvcSecurityIntegrationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,13 +23,13 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.TestPropertySource; -import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.assertj.MockMvcTester; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.assertj.core.api.Assertions.assertThat; /** * Integration tests for MockMvc security. @@ -41,25 +41,25 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. class MockMvcSecurityIntegrationTests { @Autowired - private MockMvc mockMvc; + private MockMvcTester mvc; @Test @WithMockUser(username = "test", password = "test", roles = "USER") - void okResponseWithMockUser() throws Exception { - this.mockMvc.perform(get("/")).andExpect(status().isOk()); + void okResponseWithMockUser() { + assertThat(this.mvc.get().uri("/")).hasStatusOk(); } @Test - void unauthorizedResponseWithNoUser() throws Exception { - this.mockMvc.perform(get("/").accept(MediaType.APPLICATION_JSON)).andExpect(status().isUnauthorized()); + void unauthorizedResponseWithNoUser() { + assertThat(this.mvc.get().uri("/").accept(MediaType.APPLICATION_JSON)).hasStatus(HttpStatus.UNAUTHORIZED); } @Test - void okResponseWithBasicAuthCredentialsForKnownUser() throws Exception { - this.mockMvc - .perform(get("/").header(HttpHeaders.AUTHORIZATION, - "Basic " + Base64.getEncoder().encodeToString("user:secret".getBytes()))) - .andExpect(status().isOk()); + void okResponseWithBasicAuthCredentialsForKnownUser() { + assertThat(this.mvc.get() + .uri("/") + .header(HttpHeaders.AUTHORIZATION, "Basic " + Base64.getEncoder().encodeToString("user:secret".getBytes()))) + .hasStatusOk(); } } diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/AutoConfigureMockMvcSecurityFilterOrderingIntegrationTests.java b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/AutoConfigureMockMvcSecurityFilterOrderingIntegrationTests.java index fdd3885984..18f3ef11a6 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/AutoConfigureMockMvcSecurityFilterOrderingIntegrationTests.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/AutoConfigureMockMvcSecurityFilterOrderingIntegrationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2020 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,11 +23,9 @@ import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMock import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.context.annotation.Import; import org.springframework.security.test.context.support.WithMockUser; -import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.assertj.MockMvcTester; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.assertj.core.api.Assertions.assertThat; /** * Tests for {@link AutoConfigureMockMvc @AutoConfigureMockMvc} and the ordering of Spring @@ -41,11 +39,11 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. class AutoConfigureMockMvcSecurityFilterOrderingIntegrationTests { @Autowired - private MockMvc mvc; + private MockMvcTester mvc; @Test - void afterSecurityFilterShouldFindAUserPrincipal() throws Exception { - this.mvc.perform(get("/one")).andExpect(status().isOk()).andExpect(content().string("user")); + void afterSecurityFilterShouldFindAUserPrincipal() { + assertThat(this.mvc.get().uri("/one")).hasStatusOk().hasBodyTextEqualTo("user"); } } diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/MockMvcSpringBootTestIntegrationTests.java b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/MockMvcSpringBootTestIntegrationTests.java index b267b7391a..af3b6e1f21 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/MockMvcSpringBootTestIntegrationTests.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/MockMvcSpringBootTestIntegrationTests.java @@ -39,6 +39,8 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. /** * Tests for {@link SpringBootTest @SpringBootTest} with * {@link AutoConfigureMockMvc @AutoConfigureMockMvc} (i.e. full integration test). + *

+ * This uses the regular {@link MockMvc} (Hamcrest integration). * * @author Phillip Webb * @author Moritz Halbritter diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/MockMvcTesterSpringBootTestIntegrationTests.java b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/MockMvcTesterSpringBootTestIntegrationTests.java new file mode 100644 index 0000000000..224c11ce4e --- /dev/null +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/MockMvcTesterSpringBootTestIntegrationTests.java @@ -0,0 +1,92 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.test.autoconfigure.web.servlet.mockmvc; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.autoconfigure.web.servlet.MockMvcPrint; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.boot.test.system.CapturedOutput; +import org.springframework.boot.test.system.OutputCaptureExtension; +import org.springframework.context.ApplicationContext; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.web.reactive.server.WebTestClient; +import org.springframework.test.web.servlet.assertj.MockMvcTester; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link SpringBootTest @SpringBootTest} with + * {@link AutoConfigureMockMvc @AutoConfigureMockMvc} (i.e. full integration test). + *

+ * This uses {@link MockMvcTester} (AssertJ integration). + * + * @author Stephane Nicoll + */ +@SpringBootTest +@AutoConfigureMockMvc(print = MockMvcPrint.SYSTEM_ERR, printOnlyOnFailure = false) +@WithMockUser(username = "user", password = "secret") +@ExtendWith(OutputCaptureExtension.class) +class MockMvcTesterSpringBootTestIntegrationTests { + + @MockBean + private ExampleMockableService service; + + @Autowired + private ApplicationContext applicationContext; + + @Autowired + private MockMvcTester mvc; + + @Test + void shouldFindController1(CapturedOutput output) { + assertThat(this.mvc.get().uri("/one")).hasStatusOk().hasBodyTextEqualTo("one"); + assertThat(output).contains("Request URI = /one"); + } + + @Test + void shouldFindController2() { + assertThat(this.mvc.get().uri("/two")).hasStatusOk().hasBodyTextEqualTo("hellotwo"); + } + + @Test + void shouldFindControllerAdvice() { + assertThat(this.mvc.get().uri("/error")).hasStatusOk().hasBodyTextEqualTo("recovered"); + } + + @Test + void shouldHaveRealService() { + assertThat(this.applicationContext.getBean(ExampleRealService.class)).isNotNull(); + } + + @Test + void shouldTestWithWebTestClient(@Autowired WebTestClient webTestClient) { + webTestClient.get().uri("/one").exchange().expectStatus().isOk().expectBody(String.class).isEqualTo("one"); + } + + @Test + void shouldNotFailIfFormattingValueThrowsException(CapturedOutput output) { + assertThat(this.mvc.get().uri("/formatting")).hasStatusOk().hasBodyTextEqualTo("formatting"); + assertThat(output).contains( + "Session Attrs = << Exception 'java.lang.IllegalStateException: Formatting failed' occurred while formatting >>"); + } + +} diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestAllControllersIntegrationTests.java b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestAllControllersIntegrationTests.java index 3dc1bd719a..88048c5f71 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestAllControllersIntegrationTests.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestAllControllersIntegrationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,6 +16,8 @@ package org.springframework.boot.test.autoconfigure.web.servlet.mockmvc; +import java.util.function.Consumer; + import jakarta.servlet.ServletException; import jakarta.validation.ConstraintViolationException; import org.junit.jupiter.api.Test; @@ -24,13 +26,10 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.web.servlet.error.ErrorAttributes; import org.springframework.security.test.context.support.WithMockUser; -import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.assertj.MockMvcTester; +import org.springframework.test.web.servlet.assertj.MvcTestResult; import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatExceptionOfType; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; /** * Tests for {@link WebMvcTest @WebMvcTest} when no explicit controller is defined. @@ -43,35 +42,36 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. class WebMvcTestAllControllersIntegrationTests { @Autowired - private MockMvc mvc; + private MockMvcTester mvc; @Autowired(required = false) private ErrorAttributes errorAttributes; @Test - void shouldFindController1() throws Exception { - this.mvc.perform(get("/one")).andExpect(content().string("one")).andExpect(status().isOk()); + void shouldFindController1() { + assertThat(this.mvc.get().uri("/one")).satisfies(hasBody("one")); } @Test - void shouldFindController2() throws Exception { - this.mvc.perform(get("/two")).andExpect(content().string("hellotwo")).andExpect(status().isOk()); + void shouldFindController2() { + assertThat(this.mvc.get().uri("/two")).satisfies(hasBody("hellotwo")); } @Test - void shouldFindControllerAdvice() throws Exception { - this.mvc.perform(get("/error")).andExpect(content().string("recovered")).andExpect(status().isOk()); + void shouldFindControllerAdvice() { + assertThat(this.mvc.get().uri("/error")).satisfies(hasBody("recovered")); } @Test - void shouldRunValidationSuccess() throws Exception { - this.mvc.perform(get("/three/OK")).andExpect(status().isOk()).andExpect(content().string("Hello OK")); + void shouldRunValidationSuccess() { + assertThat(this.mvc.get().uri("/three/OK")).satisfies(hasBody("Hello OK")); } @Test void shouldRunValidationFailure() { - assertThatExceptionOfType(ServletException.class).isThrownBy(() -> this.mvc.perform(get("/three/invalid"))) - .withCauseInstanceOf(ConstraintViolationException.class); + assertThat(this.mvc.get().uri("/three/invalid")).failure() + .isInstanceOf(ServletException.class) + .hasCauseInstanceOf(ConstraintViolationException.class); } @Test @@ -80,4 +80,8 @@ class WebMvcTestAllControllersIntegrationTests { } + private Consumer hasBody(String expected) { + return (result) -> assertThat(result).hasStatusOk().hasBodyTextEqualTo(expected); + } + } diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestConverterIntegrationTests.java b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestConverterIntegrationTests.java index 1a618ea4db..0e31f1dced 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestConverterIntegrationTests.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestConverterIntegrationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,11 +23,9 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.security.test.context.support.WithMockUser; -import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.assertj.MockMvcTester; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.assertj.core.api.Assertions.assertThat; /** * Tests for {@link WebMvcTest @WebMvcTest} to validate converters are discovered. @@ -39,12 +37,12 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. class WebMvcTestConverterIntegrationTests { @Autowired - private MockMvc mvc; + private MockMvcTester mvc; @Test - void shouldFindConverter() throws Exception { + void shouldFindConverter() { String id = UUID.randomUUID().toString(); - this.mvc.perform(get("/two/" + id)).andExpect(content().string(id + "two")).andExpect(status().isOk()); + assertThat(this.mvc.get().uri("/two/" + id)).hasStatusOk().hasBodyTextEqualTo(id + "two"); } } diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestCustomDispatcherServletIntegrationTests.java b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestCustomDispatcherServletIntegrationTests.java index f7f5c8e5fc..c3e617f0b0 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestCustomDispatcherServletIntegrationTests.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestCustomDispatcherServletIntegrationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,14 +20,13 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.http.HttpStatus; import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.TestPropertySource; -import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.assertj.MockMvcTester; import org.springframework.web.servlet.DispatcherServlet; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.assertj.core.api.Assertions.assertThat; /** * Tests for Test {@link DispatcherServlet} customizations. @@ -41,13 +40,12 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. class WebMvcTestCustomDispatcherServletIntegrationTests { @Autowired - private MockMvc mvc; + private MockMvcTester mvc; @Test - void dispatcherServletIsCustomized() throws Exception { - this.mvc.perform(get("/does-not-exist")) - .andExpect(status().isBadRequest()) - .andExpect(content().string("Invalid request: /does-not-exist")); + void dispatcherServletIsCustomized() { + assertThat(this.mvc.get().uri("/does-not-exist")).hasStatus(HttpStatus.BAD_REQUEST) + .hasBodyTextEqualTo("Invalid request: /does-not-exist"); } } diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestHateoasIntegrationTests.java b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestHateoasIntegrationTests.java index 735ebb950f..1b3c577a94 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestHateoasIntegrationTests.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestHateoasIntegrationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,12 +20,10 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; -import org.springframework.http.HttpHeaders; import org.springframework.security.test.context.support.WithMockUser; -import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.assertj.MockMvcTester; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; +import static org.assertj.core.api.Assertions.assertThat; /** * Integration tests for {@link WebMvcTest @WebMvcTest} and Spring HATEOAS. @@ -37,18 +35,16 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. class WebMvcTestHateoasIntegrationTests { @Autowired - private MockMvc mockMvc; + private MockMvcTester mvc; @Test - void plainResponse() throws Exception { - this.mockMvc.perform(get("/hateoas/plain")) - .andExpect(header().string(HttpHeaders.CONTENT_TYPE, "application/json")); + void plainResponse() { + assertThat(this.mvc.get().uri("/hateoas/plain")).hasContentType("application/json"); } @Test - void hateoasResponse() throws Exception { - this.mockMvc.perform(get("/hateoas/resource")) - .andExpect(header().string(HttpHeaders.CONTENT_TYPE, "application/hal+json")); + void hateoasResponse() { + assertThat(this.mvc.get().uri("/hateoas/resource")).hasContentType("application/hal+json"); } } diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestNestedIntegrationTests.java b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestNestedIntegrationTests.java index 7dcdb8ee99..05dc2732f3 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestNestedIntegrationTests.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestNestedIntegrationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,12 +21,11 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.http.HttpStatus; import org.springframework.security.test.context.support.WithMockUser; -import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.assertj.MockMvcTester; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.assertj.core.api.Assertions.assertThat; /** * Tests for {@link WebMvcTest @WebMvcTest} using {@link Nested}. @@ -38,16 +37,16 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. class WebMvcTestNestedIntegrationTests { @Autowired - private MockMvc mvc; + private MockMvcTester mvc; @Test - void shouldNotFindController1() throws Exception { - this.mvc.perform(get("/one")).andExpect(status().isNotFound()); + void shouldNotFindController1() { + assertThat(this.mvc.get().uri("/one")).hasStatus(HttpStatus.NOT_FOUND); } @Test - void shouldFindController2() throws Exception { - this.mvc.perform(get("/two")).andExpect(content().string("hellotwo")).andExpect(status().isOk()); + void shouldFindController2() { + assertThat(this.mvc.get().uri("/two")).hasStatusOk().hasBodyTextEqualTo("hellotwo"); } @Nested @@ -55,15 +54,14 @@ class WebMvcTestNestedIntegrationTests { class NestedTests { @Test - void shouldNotFindController1() throws Exception { - WebMvcTestNestedIntegrationTests.this.mvc.perform(get("/one")).andExpect(status().isNotFound()); + void shouldNotFindController1() { + assertThat(WebMvcTestNestedIntegrationTests.this.mvc.get().uri("/one")).hasStatus(HttpStatus.NOT_FOUND); } @Test - void shouldFindController2() throws Exception { - WebMvcTestNestedIntegrationTests.this.mvc.perform(get("/two")) - .andExpect(content().string("hellotwo")) - .andExpect(status().isOk()); + void shouldFindController2() { + assertThat(WebMvcTestNestedIntegrationTests.this.mvc.get().uri("/two")).hasStatusOk() + .hasBodyTextEqualTo("hellotwo"); } } diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestOneControllerIntegrationTests.java b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestOneControllerIntegrationTests.java index a458ea1e87..285601171f 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestOneControllerIntegrationTests.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestOneControllerIntegrationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,12 +20,11 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.http.HttpStatus; import org.springframework.security.test.context.support.WithMockUser; -import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.assertj.MockMvcTester; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.assertj.core.api.Assertions.assertThat; /** * Tests for {@link WebMvcTest @WebMvcTest} when a specific controller is defined. @@ -37,16 +36,16 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. class WebMvcTestOneControllerIntegrationTests { @Autowired - private MockMvc mvc; + private MockMvcTester mvc; @Test - void shouldNotFindController1() throws Exception { - this.mvc.perform(get("/one")).andExpect(status().isNotFound()); + void shouldNotFindController1() { + assertThat(this.mvc.get().uri("/one")).hasStatus(HttpStatus.NOT_FOUND); } @Test - void shouldFindController2() throws Exception { - this.mvc.perform(get("/two")).andExpect(content().string("hellotwo")).andExpect(status().isOk()); + void shouldFindController2() { + assertThat(this.mvc.get().uri("/two")).hasStatusOk().hasBodyTextEqualTo("hellotwo"); } } diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestPageableIntegrationTests.java b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestPageableIntegrationTests.java index 7482bb090c..cfb20b7a3f 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestPageableIntegrationTests.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestPageableIntegrationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,11 +21,9 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.security.test.context.support.WithMockUser; -import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.assertj.MockMvcTester; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.assertj.core.api.Assertions.assertThat; /** * Integration tests for {@link WebMvcTest @WebMvcTest} and Pageable support. @@ -37,13 +35,12 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. class WebMvcTestPageableIntegrationTests { @Autowired - private MockMvc mvc; + private MockMvcTester mvc; @Test - void shouldSupportPageable() throws Exception { - this.mvc.perform(get("/paged").param("page", "2").param("size", "42")) - .andExpect(status().isOk()) - .andExpect(content().string("2:42")); + void shouldSupportPageable() { + assertThat(this.mvc.get().uri("/paged").param("page", "2").param("size", "42")).hasStatusOk() + .hasBodyTextEqualTo("2:42"); } } diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestPrintAlwaysIntegrationTests.java b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestPrintAlwaysIntegrationTests.java index bd7ca7153a..210bfbf4cc 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestPrintAlwaysIntegrationTests.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestPrintAlwaysIntegrationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,12 +25,9 @@ import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.system.CapturedOutput; import org.springframework.boot.test.system.OutputCaptureExtension; import org.springframework.security.test.context.support.WithMockUser; -import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.assertj.MockMvcTester; import static org.assertj.core.api.Assertions.assertThat; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; /** * Tests for {@link WebMvcTest @WebMvcTest} default print output. @@ -44,11 +41,11 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. class WebMvcTestPrintAlwaysIntegrationTests { @Autowired - private MockMvc mvc; + private MockMvcTester mvc; @Test - void shouldPrint(CapturedOutput output) throws Exception { - this.mvc.perform(get("/one")).andExpect(content().string("one")).andExpect(status().isOk()); + void shouldPrint(CapturedOutput output) { + assertThat(this.mvc.get().uri("/one")).hasStatusOk().hasBodyTextEqualTo("one"); assertThat(output).contains("Request URI = /one"); } diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestPrintDefaultIntegrationTests.java b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestPrintDefaultIntegrationTests.java index ca3cb41e18..1dc53e0e4f 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestPrintDefaultIntegrationTests.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestPrintDefaultIntegrationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -32,12 +32,9 @@ import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.system.CapturedOutput; import org.springframework.boot.test.system.OutputCaptureExtension; import org.springframework.security.test.context.support.WithMockUser; -import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.assertj.MockMvcTester; import static org.assertj.core.api.Assertions.assertThat; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; /** * Tests for {@link WebMvcTest @WebMvcTest} default print output. @@ -75,11 +72,11 @@ class WebMvcTestPrintDefaultIntegrationTests { static class ShouldNotPrint { @Autowired - private MockMvc mvc; + private MockMvcTester mvc; @Test - void test() throws Exception { - this.mvc.perform(get("/one")).andExpect(content().string("one")).andExpect(status().isOk()); + void test() { + assertThat(this.mvc.get().uri("/one")).hasStatusOk().hasBodyTextEqualTo("one"); } } @@ -90,11 +87,11 @@ class WebMvcTestPrintDefaultIntegrationTests { static class ShouldPrint { @Autowired - private MockMvc mvc; + private MockMvcTester mvc; @Test - void test() throws Exception { - this.mvc.perform(get("/one")).andExpect(content().string("none")).andExpect(status().isOk()); + void test() { + assertThat(this.mvc.get().uri("/one")).hasStatusOk().hasBodyTextEqualTo("none"); } } diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestPrintDefaultOverrideIntegrationTests.java b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestPrintDefaultOverrideIntegrationTests.java index b2c1eafd7a..a96957977b 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestPrintDefaultOverrideIntegrationTests.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestPrintDefaultOverrideIntegrationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,12 +25,9 @@ import org.springframework.boot.test.system.CapturedOutput; import org.springframework.boot.test.system.OutputCaptureExtension; import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.TestPropertySource; -import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.assertj.MockMvcTester; import static org.assertj.core.api.Assertions.assertThat; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; /** * Tests for {@link WebMvcTest @WebMvcTest} when a specific controller is defined. @@ -44,11 +41,11 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. class WebMvcTestPrintDefaultOverrideIntegrationTests { @Autowired - private MockMvc mvc; + private MockMvcTester mvc; @Test - void shouldFindController1(CapturedOutput output) throws Exception { - this.mvc.perform(get("/one")).andExpect(content().string("one")).andExpect(status().isOk()); + void shouldFindController1(CapturedOutput output) { + assertThat(this.mvc.get().uri("/one")).hasStatusOk().hasBodyTextEqualTo("one"); assertThat(output).doesNotContain("Request URI = /one"); } diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestPrintOverrideIntegrationTests.java b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestPrintOverrideIntegrationTests.java index 88a2e94247..0979785bc8 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestPrintOverrideIntegrationTests.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestPrintOverrideIntegrationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,12 +26,9 @@ import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.system.CapturedOutput; import org.springframework.boot.test.system.OutputCaptureExtension; import org.springframework.security.test.context.support.WithMockUser; -import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.assertj.MockMvcTester; import static org.assertj.core.api.Assertions.assertThat; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; /** * Tests for {@link WebMvcTest @WebMvcTest} when a specific print option is defined. @@ -45,11 +42,11 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. class WebMvcTestPrintOverrideIntegrationTests { @Autowired - private MockMvc mvc; + private MockMvcTester mvc; @Test - void shouldNotPrint(CapturedOutput output) throws Exception { - this.mvc.perform(get("/one")).andExpect(content().string("one")).andExpect(status().isOk()); + void shouldNotPrint(CapturedOutput output) { + assertThat(this.mvc.get().uri("/one")).hasStatusOk().hasBodyTextEqualTo("one"); assertThat(output).doesNotContain("Request URI = /one"); } diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestServletFilterIntegrationTests.java b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestServletFilterIntegrationTests.java index c4cc7d7825..6728ef4891 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestServletFilterIntegrationTests.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestServletFilterIntegrationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,10 +20,9 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; -import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.assertj.MockMvcTester; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; +import static org.assertj.core.api.Assertions.assertThat; /** * Tests for {@link WebMvcTest @WebMvcTest} servlet filter registration. @@ -34,11 +33,11 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. class WebMvcTestServletFilterIntegrationTests { @Autowired - private MockMvc mvc; + private MockMvcTester mvc; @Test - void shouldApplyFilter() throws Exception { - this.mvc.perform(get("/one")).andExpect(header().string("x-test", "abc")); + void shouldApplyFilter() { + assertThat(this.mvc.get().uri("/one")).hasHeader("x-test", "abc"); } } diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestServletFilterRegistrationDisabledIntegrationTests.java b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestServletFilterRegistrationDisabledIntegrationTests.java index d0ab9210be..7a1967e692 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestServletFilterRegistrationDisabledIntegrationTests.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestServletFilterRegistrationDisabledIntegrationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,10 +23,9 @@ import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.context.TestConfiguration; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; -import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.assertj.MockMvcTester; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; +import static org.assertj.core.api.Assertions.assertThat; /** * Tests for {@link WebMvcTest @WebMvcTest} with a disabled filter registration. @@ -37,11 +36,11 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. class WebMvcTestServletFilterRegistrationDisabledIntegrationTests { @Autowired - private MockMvc mvc; + private MockMvcTester mvc; @Test - void shouldNotApplyFilter() throws Exception { - this.mvc.perform(get("/one")).andExpect(header().string("x-test", (String) null)); + void shouldNotApplyFilter() { + assertThat(this.mvc.get().uri("/one")).doesNotContainHeader("x-test"); } @TestConfiguration(proxyBeanMethods = false) diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestWithAutoConfigureMockMvcIntegrationTests.java b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestWithAutoConfigureMockMvcIntegrationTests.java index 6356e3532f..067b90e43e 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestWithAutoConfigureMockMvcIntegrationTests.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/web/servlet/mockmvc/WebMvcTestWithAutoConfigureMockMvcIntegrationTests.java @@ -25,11 +25,10 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.context.ApplicationContext; -import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.assertj.MockMvcTester; +import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; /** * Tests for {@link WebMvcTest @WebMvcTest} with @@ -46,11 +45,11 @@ class WebMvcTestWithAutoConfigureMockMvcIntegrationTests { private ApplicationContext context; @Autowired - private MockMvc mvc; + private MockMvcTester mvc; @Test - void shouldNotAddFilters() throws Exception { - this.mvc.perform(get("/one")).andExpect(header().doesNotExist("x-test")); + void shouldNotAddFilters() { + assertThat(this.mvc.get().uri("/one")).doesNotContainHeader("x-test"); } @Test diff --git a/spring-boot-project/spring-boot-test/src/test/java/org/springframework/boot/test/context/SpringBootContextLoaderMockMvcTests.java b/spring-boot-project/spring-boot-test/src/test/java/org/springframework/boot/test/context/SpringBootContextLoaderMockMvcTests.java index 75f7127c83..467a740bfe 100644 --- a/spring-boot-project/spring-boot-test/src/test/java/org/springframework/boot/test/context/SpringBootContextLoaderMockMvcTests.java +++ b/spring-boot-project/spring-boot-test/src/test/java/org/springframework/boot/test/context/SpringBootContextLoaderMockMvcTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,8 +27,7 @@ import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.context.web.WebAppConfiguration; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.test.web.servlet.assertj.MockMvcTester; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.context.WebApplicationContext; @@ -36,9 +35,6 @@ import org.springframework.web.context.support.WebApplicationContextUtils; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import static org.assertj.core.api.Assertions.assertThat; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; /** * Tests for {@link WebAppConfiguration @WebAppConfiguration} integration. @@ -57,16 +53,16 @@ class SpringBootContextLoaderMockMvcTests { @Autowired private ServletContext servletContext; - private MockMvc mvc; + private MockMvcTester mvc; @BeforeEach void setUp() { - this.mvc = MockMvcBuilders.webAppContextSetup(this.context).build(); + this.mvc = MockMvcTester.from(this.context); } @Test - void testMockHttpEndpoint() throws Exception { - this.mvc.perform(get("/")).andExpect(status().isOk()).andExpect(content().string("Hello World")); + void testMockHttpEndpoint() { + assertThat(this.mvc.get().uri("/")).hasStatusOk().hasBodyTextEqualTo("Hello World"); } @Test diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator-log4j2/src/test/java/smoketest/actuator/log4j2/SampleActuatorLog4J2ApplicationTests.java b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator-log4j2/src/test/java/smoketest/actuator/log4j2/SampleActuatorLog4J2ApplicationTests.java index a022ca9389..eb236ae340 100644 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator-log4j2/src/test/java/smoketest/actuator/log4j2/SampleActuatorLog4J2ApplicationTests.java +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator-log4j2/src/test/java/smoketest/actuator/log4j2/SampleActuatorLog4J2ApplicationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,12 +28,9 @@ import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMock import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.system.CapturedOutput; import org.springframework.boot.test.system.OutputCaptureExtension; -import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.assertj.MockMvcTester; import static org.assertj.core.api.Assertions.assertThat; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; /** * Tests for {@link SampleActuatorLog4J2Application}. @@ -49,7 +46,7 @@ class SampleActuatorLog4J2ApplicationTests { private static final Logger logger = LogManager.getLogger(SampleActuatorLog4J2ApplicationTests.class); @Autowired - private MockMvc mvc; + private MockMvcTester mvc; @Test void testLogger(CapturedOutput output) { @@ -58,12 +55,11 @@ class SampleActuatorLog4J2ApplicationTests { } @Test - void validateLoggersEndpoint() throws Exception { - this.mvc - .perform(get("/actuator/loggers/org.apache.coyote.http11.Http11NioProtocol").header("Authorization", - getBasicAuth())) - .andExpect(status().isOk()) - .andExpect(content().string("{\"configuredLevel\":\"WARN\",\"effectiveLevel\":\"WARN\"}")); + void validateLoggersEndpoint() { + assertThat(this.mvc.get() + .uri("/actuator/loggers/org.apache.coyote.http11.Http11NioProtocol") + .header("Authorization", getBasicAuth())).hasStatusOk() + .hasBodyTextEqualTo("{\"configuredLevel\":\"WARN\",\"effectiveLevel\":\"WARN\"}"); } private String getBasicAuth() { diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-jdbc/src/test/java/smoketest/data/jdbc/SampleDataJdbcApplicationTests.java b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-jdbc/src/test/java/smoketest/data/jdbc/SampleDataJdbcApplicationTests.java index fd17c9947c..6fe459888a 100644 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-jdbc/src/test/java/smoketest/data/jdbc/SampleDataJdbcApplicationTests.java +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-jdbc/src/test/java/smoketest/data/jdbc/SampleDataJdbcApplicationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,19 +16,14 @@ package smoketest.data.jdbc; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; -import org.springframework.web.context.WebApplicationContext; +import org.springframework.test.web.servlet.assertj.MockMvcTester; -import static org.hamcrest.Matchers.containsString; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.assertj.core.api.Assertions.assertThat; /** * Integration tests for {@link SampleDataJdbcApplication}. @@ -36,23 +31,15 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. * @author Andy Wilkinson */ @SpringBootTest +@AutoConfigureMockMvc class SampleDataJdbcApplicationTests { @Autowired - private WebApplicationContext context; - - private MockMvc mvc; - - @BeforeEach - void setUp() { - this.mvc = MockMvcBuilders.webAppContextSetup(this.context).build(); - } + private MockMvcTester mvc; @Test - void testCustomers() throws Exception { - this.mvc.perform(get("/").param("name", "merEDith")) - .andExpect(status().isOk()) - .andExpect(content().string(containsString("Meredith"))); + void testCustomers() { + assertThat(this.mvc.get().uri("/").param("name", "merEDith")).hasStatusOk().bodyText().contains("Meredith"); } } diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-jpa/src/test/java/smoketest/data/jpa/SampleDataJpaApplicationTests.java b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-jpa/src/test/java/smoketest/data/jpa/SampleDataJpaApplicationTests.java index 0917738ec8..aa5c79217e 100644 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-jpa/src/test/java/smoketest/data/jpa/SampleDataJpaApplicationTests.java +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-jpa/src/test/java/smoketest/data/jpa/SampleDataJpaApplicationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,20 +20,15 @@ import java.lang.management.ManagementFactory; import javax.management.ObjectName; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; -import org.springframework.web.context.WebApplicationContext; +import org.springframework.test.web.servlet.assertj.MockMvcTester; import static org.assertj.core.api.Assertions.assertThat; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; /** * Integration test to run the application. @@ -43,24 +38,17 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. */ // Enable JMX so we can test the MBeans (you can't do this in a properties file) @SpringBootTest(properties = "spring.jmx.enabled:true") +@AutoConfigureMockMvc @ActiveProfiles("scratch") // Separate profile for web tests to avoid clashing databases class SampleDataJpaApplicationTests { @Autowired - private WebApplicationContext context; - - private MockMvc mvc; - - @BeforeEach - void setUp() { - this.mvc = MockMvcBuilders.webAppContextSetup(this.context).build(); - } + private MockMvcTester mvc; @Test - void testHome() throws Exception { - - this.mvc.perform(get("/")).andExpect(status().isOk()).andExpect(content().string("Bath")); + void testHome() { + assertThat(this.mvc.get().uri("/")).hasStatusOk().hasBodyTextEqualTo("Bath"); } @Test diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-jpa/src/test/java/smoketest/data/jpa/SpyBeanSampleDataJpaApplicationTests.java b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-jpa/src/test/java/smoketest/data/jpa/SpyBeanSampleDataJpaApplicationTests.java index 4e2e4b801c..0df4afc119 100644 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-jpa/src/test/java/smoketest/data/jpa/SpyBeanSampleDataJpaApplicationTests.java +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-jpa/src/test/java/smoketest/data/jpa/SpyBeanSampleDataJpaApplicationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,22 +16,18 @@ package smoketest.data.jpa; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import smoketest.data.jpa.service.CityRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.SpyBean; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; -import org.springframework.web.context.WebApplicationContext; +import org.springframework.test.web.servlet.assertj.MockMvcTester; +import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.BDDMockito.then; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; /** * Tests for {@link SampleDataJpaApplication} that use {@link SpyBean @SpyBean}. @@ -39,25 +35,19 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. * @author Andy Wilkinson */ @SpringBootTest +@AutoConfigureMockMvc @AutoConfigureTestDatabase class SpyBeanSampleDataJpaApplicationTests { @Autowired - private WebApplicationContext context; - - private MockMvc mvc; + private MockMvcTester mvc; @SpyBean private CityRepository repository; - @BeforeEach - void setUp() { - this.mvc = MockMvcBuilders.webAppContextSetup(this.context).build(); - } - @Test - void testHome() throws Exception { - this.mvc.perform(get("/")).andExpect(status().isOk()).andExpect(content().string("Bath")); + void testHome() { + assertThat(this.mvc.get().uri("/")).hasStatusOk().hasBodyTextEqualTo("Bath"); then(this.repository).should().findByNameAndCountryAllIgnoringCase("Bath", "UK"); } diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-rest/src/test/java/smoketest/data/rest/SampleDataRestApplicationTests.java b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-rest/src/test/java/smoketest/data/rest/SampleDataRestApplicationTests.java index c6d5006e2f..0658671518 100644 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-rest/src/test/java/smoketest/data/rest/SampleDataRestApplicationTests.java +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-rest/src/test/java/smoketest/data/rest/SampleDataRestApplicationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,22 +16,15 @@ package smoketest.data.rest; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import smoketest.data.rest.domain.City; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; -import org.springframework.web.context.WebApplicationContext; +import org.springframework.test.web.servlet.assertj.MockMvcTester; -import static org.hamcrest.Matchers.containsString; -import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.hasSize; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.assertj.core.api.Assertions.assertThat; /** * Integration test to run the application. @@ -40,38 +33,41 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. * @author Andy Wilkinson */ @SpringBootTest +@AutoConfigureMockMvc // Separate profile for web tests to avoid clashing databases class SampleDataRestApplicationTests { @Autowired - private WebApplicationContext context; + private MockMvcTester mvc; - private MockMvc mvc; - - @BeforeEach - void setUp() { - this.mvc = MockMvcBuilders.webAppContextSetup(this.context).build(); + @Test + void testHome() { + assertThat(this.mvc.get().uri("/api")).hasStatusOk().bodyText().contains("hotels"); } @Test - void testHome() throws Exception { - this.mvc.perform(get("/api")).andExpect(status().isOk()).andExpect(content().string(containsString("hotels"))); + void findByNameAndCountry() { + assertThat(this.mvc.get() + .uri("/api/cities/search/findByNameAndCountryAllIgnoringCase?name=Melbourne&country=Australia")) + .hasStatusOk() + .bodyJson() + .extractingPath("$") + .convertTo(City.class) + .satisfies((city) -> { + assertThat(city.getName()).isEqualTo("Melbourne"); + assertThat(city.getState()).isEqualTo("Victoria"); + }); } @Test - void findByNameAndCountry() throws Exception { - this.mvc.perform(get("/api/cities/search/findByNameAndCountryAllIgnoringCase?name=Melbourne&country=Australia")) - .andExpect(status().isOk()) - .andExpect(jsonPath("state", equalTo("Victoria"))) - .andExpect(jsonPath("name", equalTo("Melbourne"))); - } - - @Test - void findByContaining() throws Exception { - this.mvc - .perform(get("/api/cities/search/findByNameContainingAndCountryContainingAllIgnoringCase?name=&country=UK")) - .andExpect(status().isOk()) - .andExpect(jsonPath("_embedded.cities", hasSize(3))); + void findByContaining() { + assertThat(this.mvc.get() + .uri("/api/cities/search/findByNameContainingAndCountryContainingAllIgnoringCase?name=&country=UK")) + .hasStatusOk() + .bodyJson() + .extractingPath("_embedded.cities") + .asArray() + .hasSize(3); } } diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jpa/src/test/java/smoketest/jpa/SampleJpaApplicationTests.java b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jpa/src/test/java/smoketest/jpa/SampleJpaApplicationTests.java index dac16490b1..7fe90cfd76 100644 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jpa/src/test/java/smoketest/jpa/SampleJpaApplicationTests.java +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-jpa/src/test/java/smoketest/jpa/SampleJpaApplicationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,18 +16,14 @@ package smoketest.jpa; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.web.WebAppConfiguration; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; -import org.springframework.web.context.WebApplicationContext; +import org.springframework.test.web.servlet.assertj.MockMvcTester; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.xpath; /** @@ -37,22 +33,15 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. * @author Dave Syer */ @SpringBootTest -@WebAppConfiguration +@AutoConfigureMockMvc class SampleJpaApplicationTests { @Autowired - private WebApplicationContext context; - - private MockMvc mvc; - - @BeforeEach - void setUp() { - this.mvc = MockMvcBuilders.webAppContextSetup(this.context).build(); - } + private MockMvcTester mvc; @Test void testHome() throws Exception { - this.mvc.perform(get("/")).andExpect(status().isOk()).andExpect(xpath("//tbody/tr").nodeCount(4)); + assertThat(this.mvc.get().uri("/")).hasStatusOk().matches(xpath("//tbody/tr").nodeCount(4)); } } diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-junit-vintage/src/test/java/smoketest/SampleJUnitVintageApplicationTests.java b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-junit-vintage/src/test/java/smoketest/SampleJUnitVintageApplicationTests.java index daeb5f612c..5fdd4e12f5 100644 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-junit-vintage/src/test/java/smoketest/SampleJUnitVintageApplicationTests.java +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-junit-vintage/src/test/java/smoketest/SampleJUnitVintageApplicationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,21 +22,20 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.assertj.MockMvcTester; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.assertj.core.api.Assertions.assertThat; @RunWith(SpringRunner.class) @WebMvcTest public class SampleJUnitVintageApplicationTests { @Autowired - private MockMvc mockMvc; + private MockMvcTester mvc; @Test - public void testMessage() throws Exception { - this.mockMvc.perform(get("/hi")).andExpect(content().string("Hello World")); + public void testMessage() { + assertThat(this.mvc.get().uri("/hi")).hasBodyTextEqualTo("Hello World"); } } diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-test/src/test/java/smoketest/test/web/UserVehicleControllerApplicationTests.java b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-test/src/test/java/smoketest/test/web/UserVehicleControllerApplicationTests.java index 6f73fdcbb8..8b7c4f7be4 100644 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-test/src/test/java/smoketest/test/web/UserVehicleControllerApplicationTests.java +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-test/src/test/java/smoketest/test/web/UserVehicleControllerApplicationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,13 +27,10 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.ApplicationContext; import org.springframework.http.MediaType; -import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.assertj.MockMvcTester; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.BDDMockito.given; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; /** * {@code @SpringBootTest} based tests for {@link UserVehicleController}. @@ -46,7 +43,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. class UserVehicleControllerApplicationTests { @Autowired - private MockMvc mvc; + private MockMvcTester mvc; @Autowired private ApplicationContext applicationContext; @@ -55,11 +52,10 @@ class UserVehicleControllerApplicationTests { private UserVehicleService userVehicleService; @Test - void getVehicleWhenRequestingTextShouldReturnMakeAndModel() throws Exception { + void getVehicleWhenRequestingTextShouldReturnMakeAndModel() { given(this.userVehicleService.getVehicleDetails("sboot")).willReturn(new VehicleDetails("Honda", "Civic")); - this.mvc.perform(get("/sboot/vehicle").accept(MediaType.TEXT_PLAIN)) - .andExpect(status().isOk()) - .andExpect(content().string("Honda Civic")); + assertThat(this.mvc.get().uri("/sboot/vehicle").accept(MediaType.TEXT_PLAIN)).hasStatusOk() + .hasBodyTextEqualTo("Honda Civic"); } @Test diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-test/src/test/java/smoketest/test/web/UserVehicleControllerTests.java b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-test/src/test/java/smoketest/test/web/UserVehicleControllerTests.java index 2db1475ad5..b0073bbcd8 100644 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-test/src/test/java/smoketest/test/web/UserVehicleControllerTests.java +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-test/src/test/java/smoketest/test/web/UserVehicleControllerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,15 +27,13 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.ApplicationContext; +import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; -import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.assertj.MockMvcTester; +import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; -import static org.hamcrest.Matchers.containsString; import static org.mockito.BDDMockito.given; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; /** * {@code @WebMvcTest} based tests for {@link UserVehicleController}. @@ -48,7 +46,7 @@ class UserVehicleControllerTests { private static final VehicleIdentificationNumber VIN = new VehicleIdentificationNumber("00000000000000000"); @Autowired - private MockMvc mvc; + private MockMvcTester mvc; @Autowired private ApplicationContext applicationContext; @@ -57,40 +55,39 @@ class UserVehicleControllerTests { private UserVehicleService userVehicleService; @Test - void getVehicleWhenRequestingTextShouldReturnMakeAndModel() throws Exception { + void getVehicleWhenRequestingTextShouldReturnMakeAndModel() { given(this.userVehicleService.getVehicleDetails("sboot")).willReturn(new VehicleDetails("Honda", "Civic")); - this.mvc.perform(get("/sboot/vehicle").accept(MediaType.TEXT_PLAIN)) - .andExpect(status().isOk()) - .andExpect(content().string("Honda Civic")); + assertThat(this.mvc.get().uri("/sboot/vehicle").accept(MediaType.TEXT_PLAIN)).hasStatusOk() + .hasBodyTextEqualTo("Honda Civic"); } @Test - void getVehicleWhenRequestingJsonShouldReturnMakeAndModel() throws Exception { + void getVehicleWhenRequestingJsonShouldReturnMakeAndModel() { given(this.userVehicleService.getVehicleDetails("sboot")).willReturn(new VehicleDetails("Honda", "Civic")); - this.mvc.perform(get("/sboot/vehicle").accept(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) - .andExpect(content().json("{'make':'Honda','model':'Civic'}")); + assertThat(this.mvc.get().uri("/sboot/vehicle").accept(MediaType.APPLICATION_JSON)).hasStatusOk() + .bodyJson() + .isLenientlyEqualTo("{'make':'Honda','model':'Civic'}"); } @Test - void getVehicleWhenRequestingHtmlShouldReturnMakeAndModel() throws Exception { + void getVehicleWhenRequestingHtmlShouldReturnMakeAndModel() { given(this.userVehicleService.getVehicleDetails("sboot")).willReturn(new VehicleDetails("Honda", "Civic")); - this.mvc.perform(get("/sboot/vehicle.html").accept(MediaType.TEXT_HTML)) - .andExpect(status().isOk()) - .andExpect(content().string(containsString("

Honda Civic

"))); + assertThat(this.mvc.get().uri("/sboot/vehicle.html").accept(MediaType.TEXT_HTML)).hasStatusOk() + .bodyText() + .contains("

Honda Civic

"); } @Test - void getVehicleWhenUserNotFoundShouldReturnNotFound() throws Exception { + void getVehicleWhenUserNotFoundShouldReturnNotFound() { given(this.userVehicleService.getVehicleDetails("sboot")).willThrow(new UserNameNotFoundException("sboot")); - this.mvc.perform(get("/sboot/vehicle")).andExpect(status().isNotFound()); + assertThat(this.mvc.get().uri("/sboot/vehicle")).hasStatus(HttpStatus.NOT_FOUND); } @Test - void getVehicleWhenVinNotFoundShouldReturnNotFound() throws Exception { + void getVehicleWhenVinNotFoundShouldReturnNotFound() { given(this.userVehicleService.getVehicleDetails("sboot")) .willThrow(new VehicleIdentificationNumberNotFoundException(VIN)); - this.mvc.perform(get("/sboot/vehicle")).andExpect(status().isNotFound()); + assertThat(this.mvc.get().uri("/sboot/vehicle")).hasStatus(HttpStatus.NOT_FOUND); } @Test diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-groovy-templates/src/test/java/smoketest/groovytemplates/MessageControllerWebTests.java b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-groovy-templates/src/test/java/smoketest/groovytemplates/MessageControllerWebTests.java index 5be52ecb82..eee8695591 100755 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-groovy-templates/src/test/java/smoketest/groovytemplates/MessageControllerWebTests.java +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-groovy-templates/src/test/java/smoketest/groovytemplates/MessageControllerWebTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,23 +18,18 @@ package smoketest.groovytemplates; import java.util.regex.Pattern; +import org.assertj.core.api.HamcrestCondition; import org.hamcrest.Description; import org.hamcrest.TypeSafeMatcher; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; -import org.springframework.web.context.WebApplicationContext; +import org.springframework.http.HttpStatus; +import org.springframework.test.web.servlet.assertj.MockMvcTester; -import static org.hamcrest.Matchers.containsString; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.assertj.core.api.Assertions.assertThat; /** * A Basic Spring MVC Test for the Sample Controller. @@ -43,37 +38,33 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. * @author Doo-Hwan, Kwak */ @SpringBootTest +@AutoConfigureMockMvc class MessageControllerWebTests { @Autowired - private WebApplicationContext wac; + private MockMvcTester mvc; - private MockMvc mockMvc; - - @BeforeEach - void setup() { - this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build(); + @Test + void testHome() { + assertThat(this.mvc.get().uri("/")).hasStatusOk().bodyText().contains("Messages"); } @Test - void testHome() throws Exception { - this.mockMvc.perform(get("/")) - .andExpect(status().isOk()) - .andExpect(content().string(containsString("<title>Messages"))); + void testCreate() { + assertThat(this.mvc.post().uri("/").param("text", "FOO text").param("summary", "FOO")) + .hasStatus(HttpStatus.FOUND) + .headers() + .hasEntrySatisfying("Location", + (values) -> assertThat(values).hasSize(1) + .element(0) + .satisfies(HamcrestCondition.matching(RegexMatcher.matches("/[0-9]+")))); } @Test - void testCreate() throws Exception { - this.mockMvc.perform(post("/").param("text", "FOO text").param("summary", "FOO")) - .andExpect(status().isFound()) - .andExpect(header().string("location", RegexMatcher.matches("/[0-9]+"))); - } - - @Test - void testCreateValidation() throws Exception { - this.mockMvc.perform(post("/").param("text", "").param("summary", "")) - .andExpect(status().isOk()) - .andExpect(content().string(containsString("is required"))); + void testCreateValidation() { + assertThat(this.mvc.post().uri("/").param("text", "").param("summary", "")).hasStatusOk() + .bodyText() + .contains("is required"); } private static class RegexMatcher extends TypeSafeMatcher<String> { diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-thymeleaf/src/test/java/smoketest/web/thymeleaf/MessageControllerWebTests.java b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-thymeleaf/src/test/java/smoketest/web/thymeleaf/MessageControllerWebTests.java index 3f34b60f8c..bee99a23c0 100644 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-thymeleaf/src/test/java/smoketest/web/thymeleaf/MessageControllerWebTests.java +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-web-thymeleaf/src/test/java/smoketest/web/thymeleaf/MessageControllerWebTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,23 +18,18 @@ package smoketest.web.thymeleaf; import java.util.regex.Pattern; +import org.assertj.core.api.HamcrestCondition; import org.hamcrest.Description; import org.hamcrest.TypeSafeMatcher; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; -import org.springframework.web.context.WebApplicationContext; +import org.springframework.http.HttpStatus; +import org.springframework.test.web.servlet.assertj.MockMvcTester; -import static org.hamcrest.Matchers.containsString; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.assertj.core.api.Assertions.assertThat; /** * A Basic Spring MVC Test for the Sample Controller. @@ -43,37 +38,33 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. * @author Doo-Hwan, Kwak */ @SpringBootTest +@AutoConfigureMockMvc class MessageControllerWebTests { @Autowired - private WebApplicationContext wac; + private MockMvcTester mvc; - private MockMvc mockMvc; - - @BeforeEach - void setup() { - this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build(); + @Test + void testHome() { + assertThat(this.mvc.get().uri("/")).hasStatusOk().bodyText().contains("<title>Messages"); } @Test - void testHome() throws Exception { - this.mockMvc.perform(get("/")) - .andExpect(status().isOk()) - .andExpect(content().string(containsString("<title>Messages"))); + void testCreate() { + assertThat(this.mvc.post().uri("/").param("text", "FOO text").param("summary", "FOO")) + .hasStatus(HttpStatus.FOUND) + .headers() + .hasEntrySatisfying("Location", + (values) -> assertThat(values).hasSize(1) + .element(0) + .satisfies(HamcrestCondition.matching(RegexMatcher.matches("/[0-9]+")))); } @Test - void testCreate() throws Exception { - this.mockMvc.perform(post("/").param("text", "FOO text").param("summary", "FOO")) - .andExpect(status().isFound()) - .andExpect(header().string("location", RegexMatcher.matches("/[0-9]+"))); - } - - @Test - void testCreateValidation() throws Exception { - this.mockMvc.perform(post("/").param("text", "").param("summary", "")) - .andExpect(status().isOk()) - .andExpect(content().string(containsString("is required"))); + void testCreateValidation() { + assertThat(this.mvc.post().uri("/").param("text", "").param("summary", "")).hasStatusOk() + .bodyText() + .contains("is required"); } private static class RegexMatcher extends TypeSafeMatcher<String> {