40.4 Test utilities
A few test utility classes are packaged as part of spring-boot
that are generally useful when testing your application.
40.4.1 ConfigFileApplicationContextInitializer
ConfigFileApplicationContextInitializer
is an ApplicationContextInitializer
that can apply to your tests to load Spring Boot application.properties
files. You can use this when you don’t need the full features provided by @SpringBootTest
.
@ContextConfiguration(classes = Config.class, initializers = ConfigFileApplicationContextInitializer.class)
Note | |
---|---|
Using ConfigFileApplicationContextInitializer alone won’t provide support for @Value("${…}") injection. Its only job is to ensure that application.properties files are loaded into Spring’s Environment . For @Value support you need to either additionally configure a PropertySourcesPlaceholderConfigurer or use @SpringBootTest where one will be auto-configured for you. |
40.4.2 EnvironmentTestUtils
EnvironmentTestUtils
allows you to quickly add properties to a ConfigurableEnvironment
or ConfigurableApplicationContext
. Simply call it with key=value
strings:
EnvironmentTestUtils.addEnvironment(env, "org=Spring", "name=Boot");
40.4.3 OutputCapture
OutputCapture
is a JUnit Rule
that you can use to capture System.out
and System.err
output. Simply declare the capture as a @Rule
then use toString()
for assertions:
import org.junit.Rule; import org.junit.Test; import org.springframework.boot.test.rule.OutputCapture; import static org.hamcrest.Matchers.*; import static org.junit.Assert.*; public class MyTest { _@Rule_ public OutputCapture capture = new OutputCapture(); _@Test_ public void testName() throws Exception { System.out.println("Hello World!"); assertThat(capture.toString(), containsString("World")); } }
40.4.4 TestRestTemplate
TestRestTemplate
is a convenience alternative to Spring’s RestTemplate
that is useful in integration tests. You can get a vanilla template or one that sends Basic HTTP authentication (with a username and password). In either case the template will behave in a test-friendly way: not following redirects (so you can assert the response location), ignoring cookies (so the template is stateless), and not throwing exceptions on server-side errors. It is recommended, but not mandatory, to use Apache HTTP Client (version 4.3.2 or better), and if you have that on your classpath the TestRestTemplate
will respond by configuring the client appropriately.
public class MyTest { private TestRestTemplate template = new TestRestTemplate(); _@Test_ public void testRequest() throws Exception { HttpHeaders headers = template.getForEntity("http://myhost.com", String.class).getHeaders(); assertThat(headers.getLocation().toString(), containsString("myotherhost")); } }
If you are using the @SpringBootTest
annotation with WebEnvironment.RANDOM_PORT
or WebEnvironment.DEFINED_PORT
, you can just inject a fully configured TestRestTemplate
and start using it. If necessary, additional customizations can be applied via the RestTemplateBuilder
bean:
_@RunWith(SpringRunner.class)_ _@SpringBootTest_ public class MyTest { _@Autowired_ private TestRestTemplate template; _@Test_ public void testRequest() throws Exception { HttpHeaders headers = template.getForEntity("http://myhost.com", String.class).getHeaders(); assertThat(headers.getLocation().toString(), containsString("myotherhost")); } _@TestConfiguration_ static class Config { _@Bean_ public RestTemplateBuilder restTemplateBuilder() { return new RestTemplateBuilder() .additionalMessageConverters(...) .customizers(...); } } }