Skip to content

Commit 2e9934c

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 2e9934c

File tree

2 files changed

+27
-1
lines changed

2 files changed

+27
-1
lines changed

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

+3-1
Original file line numberDiff line numberDiff line change
@@ -103,14 +103,16 @@ 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) -> {
107+
});
107108
}
108109

109110
private void doWithListeners(String stepName, Consumer<SpringApplicationRunListener> listenerAction,
110111
Consumer<StartupStep> stepAction) {
111112
StartupStep step = this.applicationStartup.start(stepName);
112113
this.listeners.forEach(listenerAction);
113114
stepAction.accept(step);
115+
step.end();
114116
}
115117

116118
}

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

+24
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@
141141
* @author Madhura Bhave
142142
* @author Brian Clozel
143143
* @author Artsiom Yudovin
144+
* @author Marten Deinum
144145
*/
145146
@ExtendWith(OutputCaptureExtension.class)
146147
class SpringApplicationTests {
@@ -1179,6 +1180,29 @@ void customApplicationStartupPublishStartupSteps() {
11791180
assertThat(startCount).isEqualTo(endCount);
11801181
}
11811182

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

0 commit comments

Comments
 (0)