Spring Boot: утилиты тестов

Несколько классов утилит тестов, которые обычно полезны при тестировании вашего приложения, упакованы как часть spring-boot.

ConfigFileApplicationContextInitializer

ConfigFileApplicationContextInitializer - это ApplicationContextInitializer, который можно применять к тестам для загрузки файлов Spring Boot application.properties. Вы можете использовать его, когда вам не нужен полный набор функций, предоставляемых @SpringBootTest, как показано в следующем примере:

@ContextConfiguration(classes = Config.class,
    initializers = ConfigFileApplicationContextInitializer.class)

Использование только ConfigFileApplicationContextInitializer не обеспечивает поддержку внедрения @Value("${…}"). Его единственная задача - обеспечить загрузку файлов application.properties в Spring Environment. Для поддержки @Value вам нужно либо дополнительно настроить PropertySourcesPlaceholderConfigurer, либо использовать @SpringBootTest, который автоматически настраивает его для вас.

TestPropertyValues

TestPropertyValues ​​позволяет быстро добавлять свойства в ConfigurableEnvironment или ConfigurableApplicationContext. Вы можете вызвать его с key=value строками следующим образом:

TestPropertyValues.of("org=Spring", "name=Boot").applyTo(env);

OutputCapture

OutputCapture является расширением JUnit, которое можно использовать для захвата выходных данных System.out и System.err. Чтобы использовать добавьте @ExtendWith(OutputCaptureExtension.class) и внедрите CapturedOutput в качестве аргумента в конструктор класса тестирования или метод тестирования следующим образом:

@ExtendWith(OutputCaptureExtension.class)
class OutputCaptureTests {

    @Test
    void testName(CapturedOutput output) {
        System.out.println("Hello World!");
        assertThat(output).contains("World");
    }

}

TestRestTemplate

TestRestTemplate - это удобная альтернатива Spring RestTemplate, которая полезна в интеграционных тестах. Вы можете получить простой шаблон или тот, который отправляет обычную HTTP-аутентификацию (с именем пользователя и паролем). В любом случае шаблон ведет себя дружественно к тестам, не создавая исключений при ошибках на стороне сервера.

Spring Framework 5.0 предоставляет новый WebTestClient, который работает для интеграционных тестов WebFlux и сквозного тестирования как WebFlux, так и MVC. Он обеспечивает свободный API для утверждений, в отличие от TestRestTemplate.

Рекомендуется, но не обязательно, использовать HTTP-клиент Apache (версия 4.3.2 или выше). Если у вас есть это в вашем classpath, TestRestTemplate отвечает, настраивая клиент соответствующим образом. Если вы используете HTTP-клиент Apache, включаются некоторые дополнительные удобные для тестирования функции:

  • Перенаправления не выполняются (поэтому вы можете указать место ответа).
  • Файлы cookie игнорируются (поэтому шаблон не имеет состояния).

TestRestTemplate может быть создан непосредственно в ваших интеграционных тестах, как показано в следующем примере:

public class MyTest {

    private TestRestTemplate template = new TestRestTemplate();

    @Test
    public void testRequest() throws Exception {
        HttpHeaders headers = this.template.getForEntity(
                "https://myhost.example.com/example", String.class).getHeaders();
        assertThat(headers.getLocation()).hasHost("other.example.com");
    }

}

Кроме того, если вы используете аннотацию @SpringBootTest с WebEnvironment.RANDOM_PORT или WebEnvironment.DEFINED_PORT, вы можете добавить полностью настроенный TestRestTemplate и начать его использовать. При необходимости дополнительные настройки могут быть применены через bean-компонент RestTemplateBuilder. Все URL-адреса, которые не указывают хост и порт, автоматически подключаются к встроенному серверу, как показано в следующем примере:

@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
class SampleWebClientTests {

    @Autowired
    private TestRestTemplate template;

    @Test
    void testRequest() {
        HttpHeaders headers = this.template.getForEntity("/example", String.class).getHeaders();
        assertThat(headers.getLocation()).hasHost("other.example.com");
    }

    @TestConfiguration(proxyBeanMethods = false)
    static class Config {

        @Bean
        RestTemplateBuilder restTemplateBuilder() {
            return new RestTemplateBuilder().setConnectTimeout(Duration.ofSeconds(1))
                    .setReadTimeout(Duration.ofSeconds(1));
        }

    }

}


Читайте также:


Комментарии

Популярные сообщения из этого блога

Методы класса Object в Java

Как получить текущий timestamp в Java

Основные опции JVM для повышения производительности и отладки