Skip to content

Commit d9e0c14

Browse files
committed
Use no-op lambda as default action for step action
Prior to this commit the StartupStep.end method was being called from the default step action. However when overriding the default step action this might lead to the StartupStep.end method not being called. As in the case of a failure, as that enriches the information being written. This commit also introduces a test for the failure case showing that there is a missed call to end with the initial solution. See: gh-22776
1 parent 969dd35 commit d9e0c14

File tree

2 files changed

+31
-8
lines changed

2 files changed

+31
-8
lines changed

spring-boot-project/spring-boot/src/main/java/org/springframework/boot/SpringApplicationRunListeners.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -103,14 +103,15 @@ private void callFailedListener(SpringApplicationRunListener listener, Configura
103103
}
104104

105105
private void doWithListeners(String stepName, Consumer<SpringApplicationRunListener> listenerAction) {
106-
doWithListeners(stepName, listenerAction, StartupStep::end);
106+
doWithListeners(stepName, listenerAction, (step) -> { });
107107
}
108108

109109
private void doWithListeners(String stepName, Consumer<SpringApplicationRunListener> listenerAction,
110110
Consumer<StartupStep> stepAction) {
111111
StartupStep step = this.applicationStartup.start(stepName);
112112
this.listeners.forEach(listenerAction);
113113
stepAction.accept(step);
114+
step.end();
114115
}
115116

116117
}

spring-boot-project/spring-boot/src/test/java/org/springframework/boot/SpringApplicationTests.java

+29-7
Original file line numberDiff line numberDiff line change
@@ -120,13 +120,7 @@
120120
import static org.mockito.ArgumentMatchers.isA;
121121
import static org.mockito.BDDMockito.given;
122122
import static org.mockito.BDDMockito.willThrow;
123-
import static org.mockito.Mockito.atLeastOnce;
124-
import static org.mockito.Mockito.mock;
125-
import static org.mockito.Mockito.mockingDetails;
126-
import static org.mockito.Mockito.never;
127-
import static org.mockito.Mockito.spy;
128-
import static org.mockito.Mockito.verify;
129-
import static org.mockito.Mockito.verifyNoMoreInteractions;
123+
import static org.mockito.Mockito.*;
130124

131125
/**
132126
* Tests for {@link SpringApplication}.
@@ -1179,6 +1173,34 @@ void customApplicationStartupPublishStartupSteps() {
11791173
assertThat(startCount).isEqualTo(endCount);
11801174
}
11811175

1176+
@Test
1177+
void customApplicationStartupPublishStartupStepsWithFailure() {
1178+
ApplicationStartup applicationStartup = mock(ApplicationStartup.class);
1179+
StartupStep startupStep = mock(StartupStep.class);
1180+
given(applicationStartup.start(anyString())).willReturn(startupStep);
1181+
given(startupStep.tag(anyString(), anyString())).willReturn(startupStep);
1182+
given(startupStep.tag(anyString(), ArgumentMatchers.<Supplier<String>>any())).willReturn(startupStep);
1183+
SpringApplication application = new SpringApplication(BrokenPostConstructConfig.class);
1184+
application.setWebApplicationType(WebApplicationType.NONE);
1185+
application.setApplicationStartup(applicationStartup);
1186+
assertThatExceptionOfType(BeanCreationException.class).isThrownBy(application::run);
1187+
1188+
verify(applicationStartup).start("spring.boot.application.starting");
1189+
verify(applicationStartup).start("spring.boot.application.environment-prepared");
1190+
verify(applicationStartup).start("spring.boot.application.failed");
1191+
1192+
mockingDetails(applicationStartup).getInvocations().stream()
1193+
.filter((invocation) -> invocation.getMethod().toString().contains("start("))
1194+
.map(inv -> inv.getArgument(0, String.class))
1195+
.forEach(System.out::println);
1196+
1197+
long startCount = mockingDetails(applicationStartup).getInvocations().stream()
1198+
.filter((invocation) -> invocation.getMethod().toString().contains("start(")).count();
1199+
long endCount = mockingDetails(startupStep).getInvocations().stream()
1200+
.filter((invocation) -> invocation.getMethod().toString().contains("end(")).count();
1201+
assertThat(startCount).isEqualTo(endCount);
1202+
}
1203+
11821204
private <S extends AvailabilityState> ArgumentMatcher<ApplicationEvent> isAvailabilityChangeEventWithState(
11831205
S state) {
11841206
return (argument) -> (argument instanceof AvailabilityChangeEvent<?>)

0 commit comments

Comments
 (0)