Call Application and CommandLine Runners after ready event

Closes gh-7656
This commit is contained in:
Andy Wilkinson 2017-10-30 16:41:18 +00:00
parent 27f550b8eb
commit ec470fbe59
2 changed files with 46 additions and 1 deletions

View File

@ -332,6 +332,7 @@ public class SpringApplication {
new StartupInfoLogger(this.mainApplicationClass)
.logStarted(getApplicationLog(), stopWatch);
}
callRunners(context, applicationArguments);
return context;
}
catch (Throwable ex) {
@ -757,7 +758,6 @@ public class SpringApplication {
*/
protected void afterRefresh(ConfigurableApplicationContext context,
ApplicationArguments args) {
callRunners(context, args);
}
private void callRunners(ApplicationContext context, ApplicationArguments args) {

View File

@ -38,6 +38,9 @@ import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.mockito.ArgumentCaptor;
import org.mockito.ArgumentMatchers;
import org.mockito.InOrder;
import org.mockito.Mockito;
import reactor.core.publisher.Mono;
import org.springframework.beans.BeansException;
@ -582,6 +585,33 @@ public class SpringApplicationTests {
assertThat(this.context).has(runTestRunnerBean("runnerC"));
}
@Test
@SuppressWarnings("unchecked")
public void runnersAreCalledAfterApplicationReadyEventIsPublished() throws Exception {
SpringApplication application = new SpringApplication(
MockRunnerConfiguration.class);
application.setWebApplicationType(WebApplicationType.NONE);
ApplicationListener<ApplicationReadyEvent> eventListener = mock(
ApplicationListener.class);
application.addListeners(eventListener);
this.context = application.run();
ApplicationRunner applicationRunner = this.context
.getBean(ApplicationRunner.class);
CommandLineRunner commandLineRunner = this.context
.getBean(CommandLineRunner.class);
InOrder applicationRunnerOrder = Mockito.inOrder(eventListener,
applicationRunner);
applicationRunnerOrder.verify(eventListener)
.onApplicationEvent(ArgumentMatchers.any(ApplicationReadyEvent.class));
applicationRunnerOrder.verify(applicationRunner)
.run(ArgumentMatchers.any(ApplicationArguments.class));
InOrder commandLineRunnerOrder = Mockito.inOrder(eventListener,
commandLineRunner);
commandLineRunnerOrder.verify(eventListener)
.onApplicationEvent(ArgumentMatchers.any(ApplicationReadyEvent.class));
commandLineRunnerOrder.verify(commandLineRunner).run();
}
@Test
public void loadSources() throws Exception {
Class<?>[] sources = { ExampleConfig.class, TestCommandLineRunner.class };
@ -1217,6 +1247,21 @@ public class SpringApplicationTests {
}
@Configuration
static class MockRunnerConfiguration {
@Bean
public CommandLineRunner commandLineRunner() {
return mock(CommandLineRunner.class);
}
@Bean
public ApplicationRunner applicationRunner() {
return mock(ApplicationRunner.class);
}
}
static class ExitStatusException extends RuntimeException
implements ExitCodeGenerator {