Тестирование с помощью Spring и Spock
1. Вступление
В этом коротком руководстве мы покажем преимущества сочетания поддерживающей мощностиSpring Boottesting framework и выразительностиSpock framework, будь то единица измерения илиintegration tests. .
2. Настройка проекта
Начнем с простого веб-приложения. Он может приветствовать, изменить приветствие и сбросить его до значения по умолчанию с помощью простых вызовов REST. Помимо основного класса, мы используем простойRestController для обеспечения функциональности:
@RestController
@RequestMapping("/hello")
public class WebController {
@GetMapping
public String salutation() {
return "Hello world!";
}
}
Таким образом, контроллер приветствует «Привет, мир!». Аннотация@RestController иshortcut annotations обеспечивают регистрацию конечной точки REST.
3. MavenDependencies for Spock and Spring Boot Test
Мы начнем с добавления зависимостей Maven и, при необходимости, настройки плагинов Maven.
3.1. Добавление зависимостей Spock Framework с поддержкой Spring
ДляSpock itself и дляSpring support нам нужны две зависимости:
org.spockframework
spock-core
1.2-groovy-2.4
test
org.spockframework
spock-spring
1.2-groovy-2.4
test
Обратите внимание, что версии, указанные с, являются ссылкой на используемую версию Groovy.
3.2. Добавление Spring Boot Test
Чтобы использовать утилиты тестированияSpring Boot Test, нам нужна следующая зависимость:
org.springframework.boot
spring-boot-starter-test
2.1.1.RELEASE
test
3.3. Настройка Groovy
И поскольку Spock основан наGroovy,we have to add and configure the gmavenplus-plugin as well to может использовать этот язык в наших тестах:
org.codehaus.gmavenplus
gmavenplus-plugin
1.6
compileTests
Обратите внимание: поскольку Groovy нужен нам только для тестирования, мы ограничиваем цель плагинаcompileTest.
4. ЗагрузкаApplicationContext в тесте Спока
Один простой тест -check if all Beans in the Spring application context are created:
@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. Спок обеспечивает разделение разделов в нашем тесте такими ключевыми словами, как «when”,«then” или «expect”».
Кроме того, мы можем использоватьGroovy Truth, чтобы проверить, является ли компонент нулевым, в качестве последней строки нашего теста здесь.
5. ИспользованиеWebMvcTest в тесте Спока
Точно так же мы можем проверить поведение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 (или, скорее,Specifications) we can use all familiar annotations from the Spring Boot test framework that we are used to.
6. Заключение
В этой статье мы объяснили, как настроить проект Maven для использования Spock и тестовой среды Spring Boot вместе. Кроме того, мы увидели, как обе системы отлично дополняют друг друга.
Для более глубокого погружения ознакомьтесь с нашими руководствами оtesting with Spring Boot, оSpock framework и оGroovy language.
Наконец, исходный код с дополнительными примерами можно найти в нашемGitHub repository.