1. Введение
В этом кратком руководстве мы покажем преимущества сочетания поддерживающей мощности среды тестирования Spring Boot и выразительности среды Spock , будь то модульные или интеграционные тесты .
2. Настройка проекта
Начнем с простого веб-приложения. Он может приветствовать, изменять приветствие и сбрасывать его до значения по умолчанию с помощью простых вызовов REST. Помимо основного класса, мы используем простой RestController
для обеспечения функциональности:
@RestController
@RequestMapping("/hello")
public class WebController {
@GetMapping
public String salutation() {
return "Hello world!";
}
}
Итак, контроллер приветствует «Hello world!». Аннотация @RestController
и аннотации ярлыков обеспечивают регистрацию конечной точки REST.
3. Зависимости Maven для Spock и Spring Boot Test
Мы начинаем с добавления зависимостей Maven и, при необходимости, конфигурации плагина Maven.
3.1. Добавление зависимостей Spock Framework с поддержкой Spring
Для самого Spock и для поддержки Spring нам нужны две зависимости:
<dependency>
<groupId>org.spockframework</groupId>
<artifactId>spock-core</artifactId>
<version>1.2-groovy-2.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.spockframework</groupId>
<artifactId>spock-spring</artifactId>
<version>1.2-groovy-2.4</version>
<scope>test</scope>
</dependency>
Обратите внимание, что указанные версии являются ссылкой на используемую версию groovy.
3.2. Добавление весеннего загрузочного теста
Чтобы использовать тестовые утилиты Spring Boot Test , нам понадобится следующая зависимость:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>2.5.0</version>
<scope>test</scope>
</dependency>
3.3. Настройка Groovy
А так как Spock основан на Groovy , мы должны добавить и настроить gmavenplus
-plugin, чтобы иметь возможность использовать этот язык в наших тестах:
<plugin>
<groupId>org.codehaus.gmavenplus</groupId>
<artifactId>gmavenplus-plugin</artifactId>
<version>1.6</version>
<executions>
<execution>
<goals>
<goal>compileTests</goal>
</goals>
</execution>
</executions>
</plugin>
Обратите внимание, поскольку нам нужен Groovy только для целей тестирования, и поэтому мы ограничиваем цель плагина compileTest
.
4. Загрузка ApplicationContext
в тесте Spock
Один простой тест — проверить, созданы ли все Bean-компоненты в контексте приложения Spring :
@SpringBootTest
class LoadContextTest extends Specification {
@Autowired (required = false)
private WebController webController
def "when context is loaded then all expected beans are created"() {
expect: "the WebController is created"
webController
}
}
Для этого интеграционного теста нам нужно запустить ApplicationContext
, что и делает для нас @SpringBootTest .
Спок обеспечивает разделение разделов в нашем тесте с помощью таких ключевых слов, как « когда»
, « тогда»
или « ожидать»
.
Кроме того, мы можем использовать Groovy Truth , чтобы проверить, является ли bean-компонент нулевым, как в последней строке нашего теста здесь.
5. Использование WebMvcTest
в тесте Spock
Точно так же мы можем проверить поведение WebController
:
@AutoConfigureMockMvc
@WebMvcTest
class WebControllerTest extends Specification {
@Autowired
private MockMvc mvc
def "when get is performed then the response has status 200 and content is 'Hello world!'"() {
expect: "Status is 200 and the response is 'Hello world!'"
mvc.perform(get("/hello"))
.andExpect(status().isOk())
.andReturn()
.response
.contentAsString == "Hello world!"
}
}
Важно отметить, что в наших тестах Spock (точнее, Спецификациях)
мы можем использовать все привычные аннотации из тестового фреймворка Spring Boot , к которым мы привыкли.
6. Заключение
В этой статье мы объяснили, как настроить проект Maven для совместного использования Spock и среды тестирования Spring Boot. Более того, мы увидели, как обе платформы идеально дополняют друг друга.
Для более глубокого погружения ознакомьтесь с нашими руководствами по тестированию с помощью Spring Boot , по фреймворку Spock и по языку Groovy .
Наконец, исходный код с дополнительными примерами можно найти в нашем репозитории на GitHub .