Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@
import static org.assertj.core.api.Assertions.assertThat;

/**
* AssertJ {@link org.assertj.core.api.Assert assertions} that can be applied to an
* AssertJ {@linkplain org.assertj.core.api.Assert assertions} that can be applied to an
* {@link ApplicationContext}.
*
* @param <C> the application context type
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,16 +44,18 @@
* Any {@link ApplicationContext} method called on a context that has failed to start will
* throw an {@link IllegalStateException}.
*
* @param <C> the application context type
* @param <SELF> the self class reference
* @param <C> the source application context type
* @author Phillip Webb
* @author Stefano Cordio
* @since 2.0.0
* @see AssertableApplicationContext
* @see AssertableWebApplicationContext
* @see AssertableReactiveWebApplicationContext
* @see ApplicationContextAssert
*/
public interface ApplicationContextAssertProvider<C extends ApplicationContext>
extends ApplicationContext, AssertProvider<ApplicationContextAssert<C>>, Closeable {
public interface ApplicationContextAssertProvider<SELF extends ApplicationContextAssertProvider<SELF, C>, C extends ApplicationContext>
extends ApplicationContext, AssertProvider<ApplicationContextAssert<SELF>>, Closeable {

/**
* Return an assert for AssertJ.
Expand All @@ -63,7 +65,7 @@ public interface ApplicationContextAssertProvider<C extends ApplicationContext>
*/
@Deprecated(since = "2.0.0", forRemoval = false)
@Override
ApplicationContextAssert<C> assertThat();
ApplicationContextAssert<SELF> assertThat();

/**
* Return the original source {@link ApplicationContext}.
Expand Down Expand Up @@ -104,7 +106,7 @@ public interface ApplicationContextAssertProvider<C extends ApplicationContext>
* {@link ApplicationContext} or throw an exception if the context fails to start.
* @return a {@link ApplicationContextAssertProvider} instance
*/
static <T extends ApplicationContextAssertProvider<C>, C extends ApplicationContext> T get(Class<T> type,
static <T extends ApplicationContextAssertProvider<? super T, C>, C extends ApplicationContext> T get(Class<T> type,
Class<? extends C> contextType, Supplier<? extends C> contextSupplier) {
return get(type, contextType, contextSupplier, new Class<?>[0]);
}
Expand All @@ -125,7 +127,7 @@ static <T extends ApplicationContextAssertProvider<C>, C extends ApplicationCont
* @since 3.4.0
*/
@SuppressWarnings("unchecked")
static <T extends ApplicationContextAssertProvider<C>, C extends ApplicationContext> T get(Class<T> type,
static <T extends ApplicationContextAssertProvider<? super T, C>, C extends ApplicationContext> T get(Class<T> type,
Class<? extends C> contextType, Supplier<? extends C> contextSupplier,
Class<?>... additionalContextInterfaces) {
Assert.notNull(type, "'type' must not be null");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,8 @@
* @see ApplicationContext
*/
public interface AssertableApplicationContext
extends ApplicationContextAssertProvider<ConfigurableApplicationContext>, ConfigurableApplicationContext {
extends ApplicationContextAssertProvider<AssertableApplicationContext, ConfigurableApplicationContext>,
ConfigurableApplicationContext {

/**
* Factory method to create a new {@link AssertableApplicationContext} instance.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,8 @@
* @see ReactiveWebApplicationContext
* @see ReactiveWebApplicationContext
*/
public interface AssertableReactiveWebApplicationContext
extends ApplicationContextAssertProvider<ConfigurableReactiveWebApplicationContext>,
public interface AssertableReactiveWebApplicationContext extends
ApplicationContextAssertProvider<AssertableReactiveWebApplicationContext, ConfigurableReactiveWebApplicationContext>,
ConfigurableReactiveWebApplicationContext {

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,8 @@
* @see WebApplicationContext
*/
public interface AssertableWebApplicationContext
extends ApplicationContextAssertProvider<ConfigurableWebApplicationContext>, ConfigurableWebApplicationContext {
extends ApplicationContextAssertProvider<AssertableWebApplicationContext, ConfigurableWebApplicationContext>,
ConfigurableWebApplicationContext {

/**
* Factory method to create a new {@link AssertableWebApplicationContext} instance.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@
* @see ReactiveWebApplicationContextRunner
* @see ApplicationContextAssert
*/
public abstract class AbstractApplicationContextRunner<SELF extends AbstractApplicationContextRunner<SELF, C, A>, C extends ConfigurableApplicationContext, A extends ApplicationContextAssertProvider<C>> {
public abstract class AbstractApplicationContextRunner<SELF extends AbstractApplicationContextRunner<SELF, C, A>, C extends ConfigurableApplicationContext, A extends ApplicationContextAssertProvider<A, C>> {

private final RunnerConfiguration<C> runnerConfiguration;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mock;

import org.springframework.context.ApplicationContext;
import org.springframework.context.ConfigurableApplicationContext;
Expand All @@ -40,7 +39,6 @@
*/
class ApplicationContextAssertProviderTests {

@Mock
private final ConfigurableApplicationContext mockContext = mock();

private RuntimeException startupFailure;
Expand Down Expand Up @@ -102,15 +100,17 @@ void getWhenSupplierIsNullShouldThrowException() {

@Test
void getWhenContextStartsShouldReturnProxyThatCallsRealMethods() {
ApplicationContextAssertProvider<ApplicationContext> context = get(this.mockContextSupplier);
ApplicationContextAssertProvider<TestAssertProviderApplicationContext, ApplicationContext> context = get(
this.mockContextSupplier);
assertThat((Object) context).isNotNull();
context.getBean("foo");
then(this.mockContext).should().getBean("foo");
}

@Test
void getWhenContextFailsShouldReturnProxyThatThrowsExceptions() {
ApplicationContextAssertProvider<ApplicationContext> context = get(this.startupFailureSupplier);
ApplicationContextAssertProvider<TestAssertProviderApplicationContext, ApplicationContext> context = get(
this.startupFailureSupplier);
assertThat((Object) context).isNotNull();
assertThatIllegalStateException().isThrownBy(() -> context.getBean("foo"))
.withCause(this.startupFailure)
Expand All @@ -119,27 +119,31 @@ void getWhenContextFailsShouldReturnProxyThatThrowsExceptions() {

@Test
void getSourceContextWhenContextStartsShouldReturnSourceContext() {
ApplicationContextAssertProvider<ApplicationContext> context = get(this.mockContextSupplier);
ApplicationContextAssertProvider<TestAssertProviderApplicationContext, ApplicationContext> context = get(
this.mockContextSupplier);
assertThat(context.getSourceApplicationContext()).isSameAs(this.mockContext);
}

@Test
void getSourceContextWhenContextFailsShouldThrowException() {
ApplicationContextAssertProvider<ApplicationContext> context = get(this.startupFailureSupplier);
ApplicationContextAssertProvider<TestAssertProviderApplicationContext, ApplicationContext> context = get(
this.startupFailureSupplier);
assertThatIllegalStateException().isThrownBy(context::getSourceApplicationContext)
.withCause(this.startupFailure)
.withMessageContaining("failed to start");
}

@Test
void getSourceContextOfTypeWhenContextStartsShouldReturnSourceContext() {
ApplicationContextAssertProvider<ApplicationContext> context = get(this.mockContextSupplier);
ApplicationContextAssertProvider<TestAssertProviderApplicationContext, ApplicationContext> context = get(
this.mockContextSupplier);
assertThat(context.getSourceApplicationContext(ApplicationContext.class)).isSameAs(this.mockContext);
}

@Test
void getSourceContextOfTypeWhenContextFailsToStartShouldThrowException() {
ApplicationContextAssertProvider<ApplicationContext> context = get(this.startupFailureSupplier);
ApplicationContextAssertProvider<TestAssertProviderApplicationContext, ApplicationContext> context = get(
this.startupFailureSupplier);
assertThatIllegalStateException()
.isThrownBy(() -> context.getSourceApplicationContext(ApplicationContext.class))
.withCause(this.startupFailure)
Expand All @@ -148,59 +152,68 @@ void getSourceContextOfTypeWhenContextFailsToStartShouldThrowException() {

@Test
void getStartupFailureWhenContextStartsShouldReturnNull() {
ApplicationContextAssertProvider<ApplicationContext> context = get(this.mockContextSupplier);
ApplicationContextAssertProvider<TestAssertProviderApplicationContext, ApplicationContext> context = get(
this.mockContextSupplier);
assertThat(context.getStartupFailure()).isNull();
}

@Test
void getStartupFailureWhenContextFailsToStartShouldReturnException() {
ApplicationContextAssertProvider<ApplicationContext> context = get(this.startupFailureSupplier);
ApplicationContextAssertProvider<TestAssertProviderApplicationContext, ApplicationContext> context = get(
this.startupFailureSupplier);
assertThat(context.getStartupFailure()).isEqualTo(this.startupFailure);
}

@Test
void assertThatWhenContextStartsShouldReturnAssertions() {
ApplicationContextAssertProvider<ApplicationContext> context = get(this.mockContextSupplier);
ApplicationContextAssert<ApplicationContext> contextAssert = assertThat(context);
ApplicationContextAssertProvider<TestAssertProviderApplicationContext, ApplicationContext> context = get(
this.mockContextSupplier);
ApplicationContextAssert<TestAssertProviderApplicationContext> contextAssert = assertThat(context);
assertThat(contextAssert.getApplicationContext()).isSameAs(context);
assertThat(contextAssert.getStartupFailure()).isNull();
}

@Test
void assertThatWhenContextFailsShouldReturnAssertions() {
ApplicationContextAssertProvider<ApplicationContext> context = get(this.startupFailureSupplier);
ApplicationContextAssert<ApplicationContext> contextAssert = assertThat(context);
ApplicationContextAssertProvider<TestAssertProviderApplicationContext, ApplicationContext> context = get(
this.startupFailureSupplier);
ApplicationContextAssert<TestAssertProviderApplicationContext> contextAssert = assertThat(context);
assertThat(contextAssert.getApplicationContext()).isSameAs(context);
assertThat(contextAssert.getStartupFailure()).isSameAs(this.startupFailure);
}

@Test
void toStringWhenContextStartsShouldReturnSimpleString() {
ApplicationContextAssertProvider<ApplicationContext> context = get(this.mockContextSupplier);
ApplicationContextAssertProvider<TestAssertProviderApplicationContext, ApplicationContext> context = get(
this.mockContextSupplier);
assertThat(context.toString()).startsWith("Started application [ConfigurableApplicationContext.MockitoMock")
.endsWith("id = [null], applicationName = [null], beanDefinitionCount = 0]");
}

@Test
void toStringWhenContextFailsToStartShouldReturnSimpleString() {
ApplicationContextAssertProvider<ApplicationContext> context = get(this.startupFailureSupplier);
ApplicationContextAssertProvider<TestAssertProviderApplicationContext, ApplicationContext> context = get(
this.startupFailureSupplier);
assertThat(context).hasToString("Unstarted application context "
+ "org.springframework.context.ApplicationContext[startupFailure=java.lang.RuntimeException]");
}

@Test
void closeShouldCloseContext() {
ApplicationContextAssertProvider<ApplicationContext> context = get(this.mockContextSupplier);
ApplicationContextAssertProvider<TestAssertProviderApplicationContext, ApplicationContext> context = get(
this.mockContextSupplier);
context.close();
then(this.mockContext).should().close();
}

private ApplicationContextAssertProvider<ApplicationContext> get(Supplier<ApplicationContext> contextSupplier) {
private ApplicationContextAssertProvider<TestAssertProviderApplicationContext, ApplicationContext> get(
Supplier<ApplicationContext> contextSupplier) {
return ApplicationContextAssertProvider.get(TestAssertProviderApplicationContext.class,
ApplicationContext.class, contextSupplier);
}

interface TestAssertProviderApplicationContext extends ApplicationContextAssertProvider<ApplicationContext> {
interface TestAssertProviderApplicationContext
extends ApplicationContextAssertProvider<TestAssertProviderApplicationContext, ApplicationContext> {

}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,15 @@
* @param <A> the assertable context type
* @author Stephane Nicoll
* @author Phillip Webb
* @author Stefano Cordio
*/
abstract class AbstractApplicationContextRunnerTests<T extends AbstractApplicationContextRunner<T, C, A>, C extends ConfigurableApplicationContext, A extends ApplicationContextAssertProvider<C>> {
abstract class AbstractApplicationContextRunnerTests<T extends AbstractApplicationContextRunner<T, C, A>, C extends ConfigurableApplicationContext, A extends ApplicationContextAssertProvider<A, C>> {

@Test
void runContextShouldWorkWithSatisfiesAssertion() {
get().run((context) -> assertThat(context).satisfies((ctx) -> assertThat(ctx).hasNotFailed(),
(ctx) -> assertThat(ctx).doesNotHaveBean("foo")));
}

@Test
void runWithInitializerShouldInitialize() {
Expand Down Expand Up @@ -123,7 +130,7 @@ void runWithSystemPropertiesWhenValueIsNullShouldRemoveProperty() {
}

@Test
void runWithMultiplePropertyValuesShouldAllAllValues() {
void runWithMultiplePropertyValuesShouldHaveAllValues() {
get().withPropertyValues("test.foo=1").withPropertyValues("test.bar=2").run((context) -> {
Environment environment = context.getEnvironment();
assertThat(environment.getProperty("test.foo")).isEqualTo("1");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@
* @param <A> the assertions
* @author Madhura Bhave
*/
public abstract class AbstractHealthEndpointAdditionalPathIntegrationTests<T extends AbstractApplicationContextRunner<T, C, A>, C extends ConfigurableApplicationContext, A extends ApplicationContextAssertProvider<C>> {
public abstract class AbstractHealthEndpointAdditionalPathIntegrationTests<T extends AbstractApplicationContextRunner<T, C, A>, C extends ConfigurableApplicationContext, A extends ApplicationContextAssertProvider<A, C>> {

private final T runner;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ class GrpcServerAutoConfigurationTests {

private final ServerServiceDefinition serviceDefinition = ServerServiceDefinition.builder("my-service").build();

private ApplicationContextRunner contextRunner = new ApplicationContextRunner()
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
.withConfiguration(autoConfigurations)
.with(this::noOpLifecycleBeans)
.with(this::serviceBean);
Expand Down Expand Up @@ -350,7 +350,7 @@ void nettyServerFactoryAutoConfiguredWithSsl() {
"nettyGrpcServerLifecycle"));
}

private ContextConsumer<? super ApplicationContextAssertProvider<?>> assertThatServerIsConfigured(
private ContextConsumer<? super ApplicationContextAssertProvider<?, ?>> assertThatServerIsConfigured(
Class<?> expectedServerFactoryType, String expectedAddress, String expectedLifecycleBeanName) {
return (context) -> {
assertThat(context).getBean(GrpcServerFactory.class)
Expand All @@ -365,12 +365,12 @@ private ContextConsumer<? super ApplicationContextAssertProvider<?>> assertThatS
};
}

private <R extends AbstractApplicationContextRunner<R, C, A>, C extends ConfigurableApplicationContext, A extends ApplicationContextAssertProvider<C>> R serviceBean(
private <R extends AbstractApplicationContextRunner<R, C, A>, C extends ConfigurableApplicationContext, A extends ApplicationContextAssertProvider<A, C>> R serviceBean(
R contextRunner) {
return contextRunner.withBean(BindableService.class, () -> this.service);
}

private <R extends AbstractApplicationContextRunner<R, C, A>, C extends ConfigurableApplicationContext, A extends ApplicationContextAssertProvider<C>> R noOpLifecycleBeans(
private <R extends AbstractApplicationContextRunner<R, C, A>, C extends ConfigurableApplicationContext, A extends ApplicationContextAssertProvider<A, C>> R noOpLifecycleBeans(
R contextRunner) {
return contextRunner.withBean("shadedNettyGrpcServerLifecycle", GrpcServerLifecycle.class, Mockito::mock)
.withBean("nettyGrpcServerLifecycle", GrpcServerLifecycle.class, Mockito::mock)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -348,7 +348,7 @@ private void assertNotConfigured(AssertableApplicationContext context) {
assertThat(context).doesNotHaveBean(GrpcServerHealthAutoConfiguration.class);
}

private <R extends AbstractApplicationContextRunner<R, C, A>, C extends ConfigurableApplicationContext, A extends ApplicationContextAssertProvider<C>> R serviceBean(
private <R extends AbstractApplicationContextRunner<R, C, A>, C extends ConfigurableApplicationContext, A extends ApplicationContextAssertProvider<A, C>> R serviceBean(
R contextRunner) {
return contextRunner.withBean(BindableService.class, () -> this.service);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ class GrpcServerOAuth2ResourceServerAutoConfigurationTests {
private static final AutoConfigurations autoConfigurations = AutoConfigurations
.of(OAuth2ResourceServerAutoConfiguration.class, GrpcServerOAuth2ResourceServerAutoConfiguration.class);

private ApplicationContextRunner contextRunner = new ApplicationContextRunner()
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
.withConfiguration(autoConfigurations)
.withUserConfiguration(GrpcSecurityConfiguration.class)
.with(this::serviceBean)
Expand Down Expand Up @@ -115,7 +115,7 @@ void notConfiguredInWebApplicationWithNoBindableService() {
.run((context) -> assertThat(context).doesNotHaveBean(AuthenticationProcessInterceptor.class));
}

private <R extends AbstractApplicationContextRunner<R, C, A>, C extends ConfigurableApplicationContext, A extends ApplicationContextAssertProvider<C>> R serviceBean(
private <R extends AbstractApplicationContextRunner<R, C, A>, C extends ConfigurableApplicationContext, A extends ApplicationContextAssertProvider<A, C>> R serviceBean(
R contextRunner) {
BindableService service = mock();
ServerServiceDefinition serviceDefinition = ServerServiceDefinition.builder("my-service").build();
Expand Down
Loading