Ложный запрос на получение с тестами Junit с использованием данных из базы данных h2 - PullRequest
0 голосов
/ 19 января 2020

Я знаю, что мы можем издеваться над запросом. Можем ли мы посмеяться над запросом get и вернуть данные из базы данных h2?

Мое основное приложение использует базу данных Oracle. Я смог заполнить базу данных h2 и написать тест Junit. Но я только что позвонил в сервис. Я хочу сделать запрос get и заставить его извлекать данные из базы данных h2. Как написать тест Junit для этого?

Спасибо за ваше время и помощь.

1 Ответ

2 голосов
/ 19 января 2020

Самый простой подход - TestRestTemplate.

Тестирование с TestRestTemplate и @ SpringBootTest

Один из самых простых способов проверить, что вы пытаетесь сделать. Он запускает все приложение Spring Boot и дает вам возможность взаимодействовать с REST Api через TestRestTemplate.

Вам необходимо настроить проекты с некоторыми зависимостями maven:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
    <exclusions>
        <exclusion>
            <groupId>org.junit.vintage</groupId>
            <artifactId>junit-vintage-engine</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
</dependency>

Затем создайте класс Test. Этот класс запустит ваше приложение Spring Boot и выполнит ваши тесты.

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

    @Autowired
    private TestRestTemplate testRestTemplate;

    @Test
    void testApplication() {
        int resourceId = 3;
        ResponseEntity<MyResponseObject> response = testRestTemplate.getForEntity("/myEndPoint/{resourceId}", MyResponseObject, resourceId);
        assertThat(response.getStatusCode()).isEqualTo(200);
        MyResponseObject  body = response.getBody();
        // then do what you want
    }
}

И в основном это все. Вот что нужно учитывать:

  • @SpringBootTest будет искать вашу аннотированную @SpringBootApplication или @SpringBootConfiguration. Затем он загрузит все, что у вас есть (включая услуги и доступ к h2).
  • SpringBootTest.WebEnvironment.RANDOM_PORT запустит ваш сервер через любой доступный порт на вашем компьютере. После этого вы можете одновременно запускать много экземпляров.
  • Добавив h2 к пути к классам в тестовой среде, Spring автоматически создаст источник данных для связи с вашей базой данных h2. Нет необходимости в дополнительной настройке (обычно я имею в виду). Spring Boot автоматически предоставляет
  • TestRestTemplate. Как вы заметили в моих тестах, я не предоставляю ни хост, ни порт моего тестируемого приложения SpringBoot. Spring автоматически подключается к хорошему серверу ... Magi c.

Если вы хотите обучиться, следуйте этому: https://www.baeldung.com/spring-boot-testresttemplate. Если вы хотите получить документы Spring Boot Test, выполните следующие действия: https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot -features-testing-spring-boot-Applications

Когда следует использовать TestRestTemplate:

  • Когда вы тестируете на всех уровнях вашего приложения
  • Когда вы хотите, чтобы тест был очень близок к тому, что вы будете иметь в производстве

Когда не следует:

  • Когда приложение слишком долго для запуска. Так как он загружает все о ваших приложениях, если запуск обычно занимает 20 секунд, то выполнение ваших тестов займет не менее 20 секунд. Это очень долго.
  • Когда у вас есть зависимости от системы, которую вы вообще не контролируете, вы должны также использовать @MockBean. Это не серебряная пуля. Он может работать на вашей локальной машине, но не на вашем CI-сервере, например. Будьте осторожны с этим.

Тестирование с помощью Mock Mvc

С помощью MockMvc вы также можете смоделировать тест для вашего контроллера, вы можете смоделировать запрос. Это более строгое ограничение, чем глобальный @SpringBootTest, поскольку вы запускаете не все приложения, а лишь небольшую часть, предназначенную для тестирования уровня веб-контроллера. В большинстве случаев вы не используете его для тестирования всех слоев вашего приложения, а только веб-части, высмеивая остальные.

Всегда есть способ протестировать все слои, но ясно, что вам нужно добавить класс, который вы хотите запустить самостоятельно.

Если вы хотите посмотреть, как это выглядит, go отметьте это: https://www.baeldung.com/integration-testing-in-spring

Если у вас есть дополнительные вопросы, не стесняйтесь спрашивать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...