diff --git a/spring-boot-project/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc b/spring-boot-project/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc index 76a77506b1..4aaf614cd6 100644 --- a/spring-boot-project/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc +++ b/spring-boot-project/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc @@ -6753,6 +6753,19 @@ NOTE: If you directly use `@ComponentScan` (that is, not through {dc-spring-boot}/context/TypeExcludeFilter.{dc-ext}[the Javadoc] for details. + +[[boot-features-testing-spring-boot-application-arguments]] +==== Using Application Arguments +If your application expects <>, you can +have `@SpringBootTest` inject them using the `args` attribute. + +[source,java,indent=0] +---- +include::{code-examples}/test/context/ApplicationArgumentsExampleTests.java[tag=example] +---- + + + [[boot-features-testing-spring-boot-applications-testing-with-mock-environment]] ==== Testing with a mock environment By default, `@SpringBootTest` does not start the server. If you have web endpoints that diff --git a/spring-boot-project/spring-boot-docs/src/main/java/org/springframework/boot/docs/test/context/ApplicationArgumentsExampleTests.java b/spring-boot-project/spring-boot-docs/src/main/java/org/springframework/boot/docs/test/context/ApplicationArgumentsExampleTests.java new file mode 100644 index 0000000000..94bd522d8d --- /dev/null +++ b/spring-boot-project/spring-boot-docs/src/main/java/org/springframework/boot/docs/test/context/ApplicationArgumentsExampleTests.java @@ -0,0 +1,44 @@ +/* + * Copyright 2012-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.docs.test.context; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import static org.assertj.core.api.Assertions.assertThat; + +// tag::example[] +@RunWith(SpringRunner.class) +@SpringBootTest(args = "--app.test=one") +public class ApplicationArgumentsExampleTests { + + @Autowired + private ApplicationArguments args; + + @Test + public void applicationArgumentsPopulated() { + assertThat(this.args.getOptionNames()).containsOnly("app.test"); + assertThat(this.args.getOptionValues("app.test")).containsOnly("one"); + } + +} +// end::example[] diff --git a/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/context/SpringBootContextLoader.java b/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/context/SpringBootContextLoader.java index e68b80c7a3..570aa90610 100644 --- a/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/context/SpringBootContextLoader.java +++ b/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/context/SpringBootContextLoader.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 the original author or authors. + * Copyright 2012-2019 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -124,7 +124,7 @@ public class SpringBootContextLoader extends AbstractContextLoader { application.setWebApplicationType(WebApplicationType.NONE); } application.setInitializers(initializers); - return application.run(); + return application.run(getArgs(config)); } /** @@ -145,6 +145,19 @@ public class SpringBootContextLoader extends AbstractContextLoader { return new StandardEnvironment(); } + /** + * Return the application arguments to use. If no arguments are available, return an + * empty array. + * @param config the source context configuration + * @return the application arguments to use + * @see SpringApplication#run(String...) + */ + protected String[] getArgs(MergedContextConfiguration config) { + SpringBootTest annotation = AnnotatedElementUtils + .findMergedAnnotation(config.getTestClass(), SpringBootTest.class); + return (annotation != null) ? annotation.args() : new String[0]; + } + private void setActiveProfiles(ConfigurableEnvironment environment, String[] profiles) { TestPropertyValues diff --git a/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/context/SpringBootTest.java b/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/context/SpringBootTest.java index eda5941d12..da67e11093 100644 --- a/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/context/SpringBootTest.java +++ b/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/context/SpringBootTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 the original author or authors. + * Copyright 2012-2019 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,6 +25,7 @@ import java.lang.annotation.Target; import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.boot.ApplicationArguments; import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringBootConfiguration; import org.springframework.boot.WebApplicationType; @@ -55,6 +56,8 @@ import org.springframework.web.context.WebApplicationContext; * specified. *
  • Allows custom {@link Environment} properties to be defined using the * {@link #properties() properties attribute}.
  • + *
  • Allows application arguments to be defined using the {@link #args() args + * attribute}.
  • *
  • Provides support for different {@link #webEnvironment() webEnvironment} modes, * including the ability to start a fully running web server listening on a * {@link WebEnvironment#DEFINED_PORT defined} or {@link WebEnvironment#RANDOM_PORT @@ -93,6 +96,14 @@ public @interface SpringBootTest { @AliasFor("value") String[] properties() default {}; + /** + * Application arguments that should be passed to the application under test. + * @return the application arguments to pass to the application under test. + * @see ApplicationArguments + * @see SpringApplication#run(String...) + */ + String[] args() default {}; + /** * The annotated classes to use for loading an * {@link org.springframework.context.ApplicationContext ApplicationContext}. Can also diff --git a/spring-boot-project/spring-boot-test/src/test/java/org/springframework/boot/test/context/SpringBootTestArgsTests.java b/spring-boot-project/spring-boot-test/src/test/java/org/springframework/boot/test/context/SpringBootTestArgsTests.java new file mode 100644 index 0000000000..e2806dbbf9 --- /dev/null +++ b/spring-boot-project/spring-boot-test/src/test/java/org/springframework/boot/test/context/SpringBootTestArgsTests.java @@ -0,0 +1,55 @@ +/* + * Copyright 2012-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.test.context; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.ApplicationArguments; +import org.springframework.context.annotation.Configuration; +import org.springframework.test.context.junit4.SpringRunner; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link SpringBootTest} with application arguments. + * + * @author Justin Griffin + * @author Stephane Nicoll + */ +@RunWith(SpringRunner.class) +@SpringBootTest(args = { "--option.foo=foo-value", "other.bar=other-bar-value" }) +public class SpringBootTestArgsTests { + + @Autowired + private ApplicationArguments args; + + @Test + public void applicationArgumentsPopulated() { + assertThat(this.args.getOptionNames()).containsOnly("option.foo"); + assertThat(this.args.getOptionValues("option.foo")).containsOnly("foo-value"); + assertThat(this.args.getNonOptionArgs()) + .containsOnly("other.bar=other-bar-value"); + } + + @Configuration + protected static class Config { + + } + +}