I have spent the past day trying to find a solution to this and could not find any online resource that solves this.
I am using Gson for Message conversion for my application, which works fine outside of unit testing. I even added a HttpMessageConverters
bean to take precedence over Jackson instead of writing config values to application.yml
. This only works when running the application.
Now my question is, how do I use the Gson serialization/deserialization for MockMvc
? I have a class with the @SerializedName("field_one")
annotation which the value differs from the actual name. The closest I got to finding an answer was the one below which didn't help:
https://stackoverflow.com/a/20510028/3948882
Any ideas how to replace the ObjectMapper
or have MockMvc
use Gson instead of Jackson?
Edit: To add a little more context:
When I try to send a Model
which was converted to Json with Gson, it get's immediately refused (400) because I have @NotNull
annotation for each field in the model. When it deserializes in the controller, it sets fields to null. The below example has @Valid
, which makes sure the Model
checks out.
@RequestMapping(value = "accept", method = RequestMethod.POST)
public Model resp(@Valid @RequestBody Model model){
return model;
}
On the flip side, when I go to hit an endpoint without @Valid
, passing a json that pleases Jackson, and I get the a model back, I cannot check any of the fields:
mockMvc.perform(
post("/test/accept")
.contentType(MediaType.APPLICATION_JSON)
.content(json))
.andExpect(jsonPath("$.field_one", is("Hello world!")))
Exception:
java.lang.AssertionError: No value at JSON path "$.field_one", exception: No results for path: $['field_one']