Consider SpringBootTest's web environment in context cache key
Previously, the web environment configured on `@SpringBootTest` was not part of the context cache key. As a result, two test classes that has identical configuration other than one using a MOCK web environment and the other using a DEFINED_PORT web environment would share a context when they should not do so. Classes that use MOCK and RANDOM_PORT were not affected as the use of RANDOM_PORT results in a property for the port being added to the environment. This commit adds a new ContextCustomizer, SpringBootTestWebEnvironment, that is used to capture the `webEnvironment` from `@SpringBootTest` and use it in its hashCode and equals implementations. This fixes the problem as all context customizers are evaluated when determing the equality of two context cache keys. Fixes gh-23085
This commit is contained in:
@@ -71,6 +71,24 @@ class SpringBootTestContextBootstrapperTests {
|
||||
assertThat(contextConfiguration).isEqualTo(otherContextConfiguration);
|
||||
}
|
||||
|
||||
@Test
|
||||
void mergedContextConfigurationWhenWebEnvironmentsDifferentShouldNotBeConsideredEqual() {
|
||||
TestContext context = buildTestContext(SpringBootTestMockWebEnvironmentConfiguration.class);
|
||||
Object contextConfiguration = ReflectionTestUtils.getField(context, "mergedContextConfiguration");
|
||||
TestContext otherContext = buildTestContext(SpringBootTestDefinedPortWebEnvironmentConfiguration.class);
|
||||
Object otherContextConfiguration = ReflectionTestUtils.getField(otherContext, "mergedContextConfiguration");
|
||||
assertThat(contextConfiguration).isNotEqualTo(otherContextConfiguration);
|
||||
}
|
||||
|
||||
@Test
|
||||
void mergedContextConfigurationWhenWebEnvironmentsSameShouldtBeConsideredEqual() {
|
||||
TestContext context = buildTestContext(SpringBootTestMockWebEnvironmentConfiguration.class);
|
||||
Object contextConfiguration = ReflectionTestUtils.getField(context, "mergedContextConfiguration");
|
||||
TestContext otherContext = buildTestContext(SpringBootTestAnotherMockWebEnvironmentConfiguration.class);
|
||||
Object otherContextConfiguration = ReflectionTestUtils.getField(otherContext, "mergedContextConfiguration");
|
||||
assertThat(contextConfiguration).isEqualTo(otherContextConfiguration);
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
private TestContext buildTestContext(Class<?> testClass) {
|
||||
SpringBootTestContextBootstrapper bootstrapper = new SpringBootTestContextBootstrapper();
|
||||
@@ -99,6 +117,21 @@ class SpringBootTestContextBootstrapperTests {
|
||||
|
||||
}
|
||||
|
||||
@SpringBootTest(webEnvironment = WebEnvironment.MOCK)
|
||||
static class SpringBootTestMockWebEnvironmentConfiguration {
|
||||
|
||||
}
|
||||
|
||||
@SpringBootTest(webEnvironment = WebEnvironment.MOCK)
|
||||
static class SpringBootTestAnotherMockWebEnvironmentConfiguration {
|
||||
|
||||
}
|
||||
|
||||
@SpringBootTest(webEnvironment = WebEnvironment.DEFINED_PORT)
|
||||
static class SpringBootTestDefinedPortWebEnvironmentConfiguration {
|
||||
|
||||
}
|
||||
|
||||
@SpringBootTest(args = "--app.test=same")
|
||||
static class SpringBootTestSameArgsConfiguration {
|
||||
|
||||
|
||||
Reference in New Issue
Block a user