Eu tenho teste de integração simples
@Test
public void shouldReturnErrorMessageToAdminWhenCreatingUserWithUsedUserName() throws Exception {
mockMvc.perform(post("/api/users").header("Authorization", base64ForTestUser).contentType(MediaType.APPLICATION_JSON)
.content("{\"userName\":\"testUserDetails\",\"firstName\":\"xxx\",\"lastName\":\"xxx\",\"password\":\"xxx\"}"))
.andDo(print())
.andExpect(status().isBadRequest())
.andExpect(?);
}
Na última linha, quero comparar a sequência recebida no corpo da resposta à sequência esperada
E em resposta eu recebo:
MockHttpServletResponse:
Status = 400
Error message = null
Headers = {Content-Type=[application/json]}
Content type = application/json
Body = "Username already taken"
Forwarded URL = null
Redirected URL = null
Tentei alguns truques com conteúdo (), corpo (), mas nada funcionou.
java
spring
mocking
spring-test-mvc
pbaranski
fonte
fonte
"Username already taken"
. Isso deveria ser mais um conflito.Respostas:
Você pode chamar
andReturn()
e usar oMvcResult
objeto retornado para obter o conteúdo como umString
.Ver abaixo:
fonte
@RestController
indica que todos os métodos de manipulador estão implicitamente anotados@ResponseBody
. Isso significa que o Spring usará aHttpMessageConverter
para serializar o valor de retorno do manipulador e gravá-lo na resposta. Você pode muito bem obter o corpocontent()
.getContentAsString()
aquele que veio do meu@RestController
controlador anotado.result.getResponse().getErrorMessage()
andReturn
retorna aMvcResult
, conforme especificado no javadoc aqui .@Sotirios Delimanolis reply fazer o trabalho, no entanto, eu estava procurando comparar seqüências de caracteres dentro desta afirmação mockMvc
Então aqui está
É claro que minha afirmação falha:
Porque:
Portanto, isso é prova de que funciona!
fonte
.andExpect(content().string(containsString("\"Username already taken");
org.hamcrest.Matchers.containsString()
.org.hamcrest.Matchers.equalToIgnoringWhiteSpace()
matcher para ignorar todos os caracteres de espaço em branco. Talvez seja uma dica útil para alguémO Spring MockMvc agora tem suporte direto para JSON. Então você apenas diz:
e, diferentemente da comparação de cadeias, ele diz algo como "campo ausente xyz" ou "mensagem Esperado 'ok' obteve 'nok'.
Este método foi introduzido no Spring 4.1.
fonte
ContentRequestMatchers
suportar esse recurso também?Lendo essas respostas, posso ver muita coisa relacionada à versão 4.x do Spring, estou usando a versão 3.2.0 por vários motivos. Portanto, coisas como o json support diretamente do
content()
não são possíveis.Eu descobri que o uso
MockMvcResultMatchers.jsonPath
é realmente fácil e funciona. Aqui está um exemplo de teste de um método de postagem.O bônus com esta solução é que você ainda está correspondendo aos atributos, não confiando nas comparações completas do json string.
(Usando
org.springframework.test.web.servlet.result.MockMvcResultMatchers
)O corpo da solicitação era apenas uma string json, que você pode carregar facilmente de um arquivo de dados simulado json real, se quisesse, mas eu não o incluí aqui, pois teria se desviado da pergunta.
O json real retornado teria a seguinte aparência:
fonte
Retirado do tutorial da primavera
is
está disponível emimport static org.hamcrest.Matchers.*;
jsonPath
está disponível emimport static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
e
jsonPath
referência pode ser encontrada aquifonte
error: incompatible types: RequestMatcher cannot be converted to ResultMatcher
para.andExpect(content().contentType(contentType))
@WithMockUser
OcontainsString
matcher de segurança de primavera e hamcrest cria uma solução simples e elegante:Mais exemplos no github
fonte
Aqui está um exemplo de como analisar a resposta JSON e até como enviar uma solicitação com um bean no formato JSON:
Como você pode ver aqui, o
Book
DTO de solicitaçãoUpdateBookResponse
é e o objeto de resposta é analisado a partir do JSON. Você pode alterar aObjectMapper
configuração do Jakson .fonte
Isso deve fornecer o corpo da resposta. "Nome de usuário já utilizado" no seu caso.
fonte
aqui uma maneira mais elegante
fonte
Você pode usar o método 'getContentAsString' para obter os dados de resposta como sequência.
Você pode consultar este link para o aplicativo de teste.
fonte
Uma abordagem possível é simplesmente incluir
gson
dependência:e analise o valor para fazer suas verificações:
fonte