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:
Andy Wilkinson
2020-09-24 14:11:43 +01:00
parent d208ec92fc
commit bf9d23e55a
3 changed files with 91 additions and 0 deletions

View File

@@ -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 {