Home / Class/ SpringApplicationAotProcessorTests Class — spring-boot Architecture

SpringApplicationAotProcessorTests Class — spring-boot Architecture

Architecture documentation for the SpringApplicationAotProcessorTests class in SpringApplicationAotProcessorTests.java from the spring-boot codebase.

Entity Profile

Source Code

core/spring-boot/src/test/java/org/springframework/boot/SpringApplicationAotProcessorTests.java lines 38–196

class SpringApplicationAotProcessorTests {

	private static final ApplicationInvoker invoker = new ApplicationInvoker();

	@BeforeEach
	void setup() {
		invoker.clean();
	}

	@Test
	void processApplicationInvokesMainMethod(@TempDir Path directory) {
		String[] arguments = new String[] { "1", "2" };
		SpringApplicationAotProcessor processor = new SpringApplicationAotProcessor(PublicMainMethod.class,
				settings(directory), arguments);
		processor.process();
		assertThat(ApplicationInvoker.argsHolder).isEqualTo(arguments);
		assertThat(ApplicationInvoker.postRunInvoked).isFalse();
	}

	@Test
	void processApplicationWithMainMethodThatDoesNotRun(@TempDir Path directory) {
		SpringApplicationAotProcessor processor = new SpringApplicationAotProcessor(BrokenApplication.class,
				settings(directory), new String[0]);
		assertThatIllegalStateException().isThrownBy(processor::process)
			.withMessageContaining("Does it run a SpringApplication?");
		assertThat(directory).isEmptyDirectory();
	}

	@Test
	void invokeMainParsesArgumentsAndInvokesMainMethod(@TempDir Path directory) throws Exception {
		String[] mainArguments = new String[] { PublicMainMethod.class.getName(),
				directory.resolve("source").toString(), directory.resolve("resource").toString(),
				directory.resolve("class").toString(), "com.example", "example", "1", "2" };
		SpringApplicationAotProcessor.main(mainArguments);
		assertThat(ApplicationInvoker.argsHolder).containsExactly("1", "2");
		assertThat(ApplicationInvoker.postRunInvoked).isFalse();
	}

	@Test
	void invokeMainParsesArgumentsAndInvokesPackagePrivateMainMethod(@TempDir Path directory) throws Exception {
		String[] mainArguments = new String[] { PackagePrivateMainMethod.class.getName(),
				directory.resolve("source").toString(), directory.resolve("resource").toString(),
				directory.resolve("class").toString(), "com.example", "example", "1", "2" };
		SpringApplicationAotProcessor.main(mainArguments);
		assertThat(ApplicationInvoker.argsHolder).containsExactly("1", "2");
		assertThat(ApplicationInvoker.postRunInvoked).isFalse();
	}

	@Test
	void invokeMainParsesArgumentsAndInvokesParameterLessMainMethod(@TempDir Path directory) throws Exception {
		String[] mainArguments = new String[] { PublicParameterlessMainMethod.class.getName(),
				directory.resolve("source").toString(), directory.resolve("resource").toString(),
				directory.resolve("class").toString(), "com.example", "example", "1", "2" };
		SpringApplicationAotProcessor.main(mainArguments);
		assertThat(ApplicationInvoker.argsHolder).isNull();
		assertThat(ApplicationInvoker.postRunInvoked).isFalse();
	}

	@Test
	void invokeMainParsesArgumentsAndInvokesPackagePrivateRunMethod(@TempDir Path directory) throws Exception {
		String[] mainArguments = new String[] { PackagePrivateParameterlessMainMethod.class.getName(),
				directory.resolve("source").toString(), directory.resolve("resource").toString(),
				directory.resolve("class").toString(), "com.example", "example", "1", "2" };
		SpringApplicationAotProcessor.main(mainArguments);
		assertThat(ApplicationInvoker.argsHolder).isNull();
		assertThat(ApplicationInvoker.postRunInvoked).isFalse();
	}

	@Test
	void invokeMainParsesArgumentsAndInvokesRunMethodWithoutGroupId(@TempDir Path directory) throws Exception {
		String[] mainArguments = new String[] { PublicMainMethod.class.getName(),
				directory.resolve("source").toString(), directory.resolve("resource").toString(),
				directory.resolve("class").toString(), "", "example", "1", "2" };
		SpringApplicationAotProcessor.main(mainArguments);
		assertThat(ApplicationInvoker.argsHolder).containsExactly("1", "2");
		assertThat(ApplicationInvoker.postRunInvoked).isFalse();
	}

	@Test
	void invokeMainWithMissingArguments() {
		assertThatIllegalStateException().isThrownBy(() -> SpringApplicationAotProcessor.main(new String[] { "Test" }))
			.withMessageContaining("Usage:");
	}

	private Settings settings(Path directory) {
		return Settings.builder()
			.sourceOutput(directory.resolve("source"))
			.resourceOutput(directory.resolve("resource"))
			.classOutput(directory.resolve("class"))
			.groupId("com.example")
			.artifactId("example")
			.build();

	}

	@Configuration(proxyBeanMethods = false)
	public static class PublicMainMethod {

		public static void main(String[] args) {
			invoker.invoke(args, () -> SpringApplication.run(PublicMainMethod.class, args));
		}

	}

	@Configuration(proxyBeanMethods = false)
	public static class PackagePrivateMainMethod {

		static void main(String[] args) {
			invoker.invoke(args, () -> SpringApplication.run(PackagePrivateMainMethod.class, args));
		}

	}

	@Configuration(proxyBeanMethods = false)
	public static class PublicParameterlessMainMethod {

		public static void main() {
			invoker.invoke(null, () -> SpringApplication.run(PublicParameterlessMainMethod.class));
		}

	}

	@Configuration(proxyBeanMethods = false)
	public static class PackagePrivateParameterlessMainMethod {

		static void main() {
			invoker.invoke(null, () -> SpringApplication.run(PackagePrivateParameterlessMainMethod.class));
		}

	}

	public static class BrokenApplication {

		public static void main(String[] args) {
			// Does not run an application
		}

	}

	private static final class ApplicationInvoker {

		public static String @Nullable [] argsHolder;

		public static boolean postRunInvoked;

		void invoke(String @Nullable [] args, Runnable applicationRun) {
			argsHolder = args;
			applicationRun.run();
			postRunInvoked = true;
		}

		void clean() {
			argsHolder = null;
			postRunInvoked = false;
		}

	}

}

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free