Introdução ao Spring MVC Test Framework e MockMvcTester
Ao concluirmos esta aula, nós:
- Saberemos o que é o Spring MVC Test Framework.
- Seremos capazes de identificar os componentes principais do Spring MVC Test Framework (
MockMvc,MockMvcBuilders,MockMvcRequestBuilders,MockMvcResultMatchers, além da evolução modernaMockMvcTesterintegrada ao AssertJ). - Saberemos como declarar as dependências necessárias com Maven e Gradle 9 tanto para aplicações Spring Framework puras quanto para aplicações Spring Boot 4.1.
O Que É o Spring MVC Test Framework?
O Spring MVC Test é um framework de testes que fornece suporte completo para testar controladores Spring MVC (@Controller e @RestController). Ao escrevermos testes unitários utilizando o Spring MVC Test Framework, devemos saber que:
- Ele suporta qualquer motor de execução na plataforma JUnit (JUnit Jupiter 6, Kotest etc.) e TestNG.
- Como o Spring MVC Test é construído sobre os objetos mock da Servlet API (
MockHttpServletRequest,MockHttpServletResponse) fornecidos pelo módulospring-test, ele não precisa subir um container Servlet real (como Tomcat ou Jetty), executando cada teste em poucos milissegundos! - Ele utiliza a classe
DispatcherServletreal por baixo dos panos, oferecendo suporte fiel ao comportamento de tempo de execução do Spring MVC (roteamento de URLs, resolução de argumentos, serialização JSON, validação@Valid, tratamento de exceções e resolução de views). - Podemos configurar o Sistema Sob Teste utilizando a configuração standalone (
standaloneSetup) ou a configuração baseada no contexto de aplicação web (webAppContextSetup). Conversaremos sobre qual escolher para testes unitários na próxima aula deste tópico.
A seguir, conheceremos os componentes principais do Spring MVC Test Framework.
Os Componentes Principais do Spring MVC Test Framework
1. Componentes de Configuração e Ponto de Entrada
Quando queremos configurar o Spring MVC Test Framework, utilizamos estes componentes:
MockMvc: Atua como o ponto de entrada principal que utilizamos para enviar as requisições HTTP que serão processadas pelo controlador testado.MockMvcBuilders: Fornece métodos fábrica estáticos que utilizamos para criar novas instâncias deMockMvc.StandaloneMockMvcBuilder: Retornado pelo métodoMockMvcBuilders.standaloneSetup(controller). Utilizamos esse builder quando queremos configurar a infraestrutura do Spring MVC programaticamente em modo isolado (ideal para testes unitários).DefaultMockMvcBuilder: Retornado pelo métodoMockMvcBuilders.webAppContextSetup(webApplicationContext). Utilizamos esse builder quando queremos configurar a infraestrutura do Spring MVC a partir de um contexto completo do Spring (ideal para testes de integração).
[!TIP] Novidade no Spring Framework 6.2+ / Spring Boot 4.1:
MockMvcTesterAlém doMockMvcclássico, o Spring moderno introduziu oMockMvcTester(org.springframework.test.web.servlet.assertj.MockMvcTester), que envolve oMockMvc(viaMockMvcTester.of(controller)ouMockMvcTester.create(mockMvc)) para oferecer asserções fluentes nativas baseadas em AssertJ (assertThat(mvc.get().uri("/"))...), além da DSL KotlinmockMvc.get("/") { ... }. Neste curso você aprenderá a API canônica doMockMvc(amplamente usada em código existente) e também verá como oMockMvcTesterse conecta a ela!
2. Componentes de Requisição e Verificação de Resposta
Quando queremos criar uma requisição HTTP usando o objeto MockMvc criado, enviá-la ao controlador testado e escrever asserções sobre a resposta retornada, utilizamos estes quatro componentes:
MockMvcRequestBuilders: Fornece métodos fábrica estáticos (get(),post(),put(),delete(),patch(),multipart()) que utilizamos para criar as requisições HTTP processadas pelo controlador testado.MockHttpServletRequestBuildereMockMultipartHttpServletRequestBuilder: Objetos retornados pelos métodos deMockMvcRequestBuildersque nos ajudam a configurar a “entrada” enviada ao controlador (corpo da requisição, cabeçalhos HTTP, cookies, parâmetros de query/formulário,Content-Typeetc.).MockMvcResultMatchers: Fornece métodos fábrica estáticos (status(),view(),model(),content(),jsonPath(),header(),flash(),forwardedUrl(),redirectedUrl()) que utilizamos dentro de.andExpect(...)para escrever asserções sobre a resposta HTTP retornada.MockMvcResultHandlers: Fornece métodos fábrica estáticos (print(),log()) que utilizamos dentro de.andDo(...)para imprimir detalhes completos da requisição e da resposta no console ou nos arquivos de log durante a depuração de um teste.
Falaremos em detalhes sobre como usar cada um desses componentes nas próximas aulas deste tópico. Agora vamos descobrir como obter as dependências necessárias no projeto!
Obtendo as Dependências Necessárias
Esta seção descreve como declarar as dependências necessárias tanto em uma aplicação web Spring Framework tradicional quanto em uma aplicação web que utiliza Spring Boot 4.1.
1. Dependências em uma Aplicação Web Spring Framework Tradicional
Se estivermos escrevendo testes unitários para uma aplicação web Spring Framework sem Spring Boot, precisamos declarar a dependência spring-test (e jakarta.servlet-api) no nosso script de build.
Se estivermos utilizando Maven, adicionamos o seguinte trecho ao nosso arquivo pom.xml:
|
|
Se estivermos utilizando Gradle 9 (Kotlin DSL), adicionamos o seguinte trecho ao nosso arquivo build.gradle.kts:
|
|
2. Dependências em uma Aplicação Web com Spring Boot 4.1
Se estivermos escrevendo testes unitários para uma aplicação web que utiliza Spring Boot 4.1, basta incluir o starter de testes spring-boot-starter-test (e spring-boot-starter-webmvc-test se modularizado) em nosso script de build — ele já traz automaticamente spring-test, JUnit Jupiter 6, AssertJ, Hamcrest e JsonPath!
Se estivermos utilizando Maven, adicionamos o seguinte trecho ao nosso arquivo pom.xml:
|
|
Se estivermos utilizando Gradle 9 (Kotlin DSL), adicionamos o seguinte trecho ao nosso arquivo build.gradle.kts:
|
|
[!NOTE] Em projetos Kotlin com Spring Boot, lembre-se também de incluir
io.mockk:mockk(como vimos no Tópico 05) ecom.fasterxml.jackson.module:jackson-module-kotlinpara serialização/desserialização perfeita de data classes em testes de APIs REST.
Vamos resumir o que aprendemos nesta aula!
Resumo
Nesta aula, aprendemos cinco pontos fundamentais:
- O Spring MVC Test Framework não requer um container Servlet em execução (rodando em memória com altíssima velocidade).
- O Spring MVC Test Framework utiliza o
DispatcherServletinternamente, oferecendo suporte completo ao comportamento real do Spring MVC em tempo de execução. - Identificamos os componentes-chave do framework (
MockMvc,MockMvcBuilders,StandaloneMockMvcBuilder,MockMvcRequestBuilders,MockMvcResultMatchers,MockMvcResultHandlerseMockMvcTester) e quando utilizá-los. - Para testar uma aplicação web Spring pura, declaramos a dependência
org.springframework:spring-test. - Para testar uma aplicação web com Spring Boot, declaramos a dependência
org.springframework.boot:spring-boot-starter-test.