|
71 | 71 | import org.springframework.boot.context.event.ApplicationStartingEvent;
|
72 | 72 | import org.springframework.boot.context.event.SpringApplicationEvent;
|
73 | 73 | import org.springframework.boot.convert.ApplicationConversionService;
|
| 74 | +import org.springframework.boot.testsupport.classpath.ForkedClassPath; |
74 | 75 | import org.springframework.boot.testsupport.system.CapturedOutput;
|
75 | 76 | import org.springframework.boot.testsupport.system.OutputCaptureExtension;
|
76 | 77 | import org.springframework.boot.web.embedded.netty.NettyReactiveWebServerFactory;
|
@@ -749,6 +750,53 @@ void failureInReadyEventListenerCloseApplicationContext(CapturedOutput output) {
|
749 | 750 | assertThat(output).contains("Application run failed");
|
750 | 751 | }
|
751 | 752 |
|
| 753 | + @Test |
| 754 | + void failureOnTheJvmLogsApplicationRunFailed(CapturedOutput output) { |
| 755 | + SpringApplication application = new SpringApplication(ExampleConfig.class); |
| 756 | + application.setWebApplicationType(WebApplicationType.NONE); |
| 757 | + ExitCodeListener exitCodeListener = new ExitCodeListener(); |
| 758 | + application.addListeners(exitCodeListener); |
| 759 | + @SuppressWarnings("unchecked") |
| 760 | + ApplicationListener<SpringApplicationEvent> listener = mock(ApplicationListener.class); |
| 761 | + application.addListeners(listener); |
| 762 | + ExitStatusException failure = new ExitStatusException(); |
| 763 | + willThrow(failure).given(listener).onApplicationEvent(isA(ApplicationReadyEvent.class)); |
| 764 | + assertThatExceptionOfType(RuntimeException.class).isThrownBy(application::run); |
| 765 | + then(listener).should().onApplicationEvent(isA(ApplicationReadyEvent.class)); |
| 766 | + then(listener).should(never()).onApplicationEvent(isA(ApplicationFailedEvent.class)); |
| 767 | + assertThat(exitCodeListener.getExitCode()).isEqualTo(11); |
| 768 | + // Leading space only happens when logging |
| 769 | + assertThat(output).contains(" Application run failed").contains("ExitStatusException"); |
| 770 | + } |
| 771 | + |
| 772 | + @Test |
| 773 | + @ForkedClassPath |
| 774 | + void failureInANativeImageWritesFailureToSystemOut(CapturedOutput output) { |
| 775 | + System.setProperty("org.graalvm.nativeimage.imagecode", "true"); |
| 776 | + try { |
| 777 | + SpringApplication application = new SpringApplication(ExampleConfig.class); |
| 778 | + application.setWebApplicationType(WebApplicationType.NONE); |
| 779 | + ExitCodeListener exitCodeListener = new ExitCodeListener(); |
| 780 | + application.addListeners(exitCodeListener); |
| 781 | + @SuppressWarnings("unchecked") |
| 782 | + ApplicationListener<SpringApplicationEvent> listener = mock(ApplicationListener.class); |
| 783 | + application.addListeners(listener); |
| 784 | + ExitStatusException failure = new ExitStatusException(); |
| 785 | + willThrow(failure).given(listener).onApplicationEvent(isA(ApplicationReadyEvent.class)); |
| 786 | + assertThatExceptionOfType(RuntimeException.class).isThrownBy(application::run); |
| 787 | + then(listener).should().onApplicationEvent(isA(ApplicationReadyEvent.class)); |
| 788 | + then(listener).should(never()).onApplicationEvent(isA(ApplicationFailedEvent.class)); |
| 789 | + assertThat(exitCodeListener.getExitCode()).isEqualTo(11); |
| 790 | + // Leading space only happens when logging |
| 791 | + assertThat(output).doesNotContain(" Application run failed") |
| 792 | + .contains("Application run failed") |
| 793 | + .contains("ExitStatusException"); |
| 794 | + } |
| 795 | + finally { |
| 796 | + System.clearProperty("org.graalvm.nativeimage.imagecode"); |
| 797 | + } |
| 798 | + } |
| 799 | + |
752 | 800 | @Test
|
753 | 801 | void loadSources() {
|
754 | 802 | Class<?>[] sources = { ExampleConfig.class, TestCommandLineRunner.class };
|
|
0 commit comments