提问者:小点点

Spring MockMVC默认响应中的ContentType错误


我刚刚更新了我的应用程序以使用spring-test 5.3.12和JUnit 5.7.2,但现在我的测试失败了。

对于以前的版本(5.2.X),响应类型始终为“application/json”,但现在我收到此错误:

java.lang.AssertionError: Content type expected:<application/json> but 
was:<application/json;charset=UTF-8>
Expected :application/json
Actual   :application/json;charset=UTF-8

我已经检查了响应上的内容Type实际上是带有Postman、Browser和Swagger的application/json

失败的测试示例

@Test
void whenGetReleaseNotesAppVersionWithNoExistingCodeThenNotFoundInJsonFormat() throws Exception {
    this.mvc.perform(get(
            NEWER_RELEASES_PATH_UPDATE_CONFIG + "/"
                    + "6.0.0" + "/notes")
                        .header(AUTH_HEADER, AUTH_TOKEN_SRVCGERETDESAX)
                        .locale(Locale.ENGLISH)
                        .accept(MediaType.APPLICATION_JSON))
        .andExpect(status().isNotFound())
        .andExpect(content().contentType(MediaType.APPLICATION_JSON))
        .andExpect(jsonPath(
                "$.code", is(ApiErrorCode.RELEASE_NOTES_NOT_FOUND.getCode())));
}

无法将 MediaType 更改为 APPLICATION_JSON_UTF8,因为现已弃用,所以我无法弄清楚如何解决这个问题。

MockMVC只是自动连线的,无需进一步配置

   @Autowired
   private MockMvc mvc;

课堂上的批注

@ExtendWith(SpringExtension.class)
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = {
        Application.class })
@ActiveProfiles({ "test" })
@EnableAutoConfiguration
@AutoConfigureMockMvc
class UpdateConfigControllerIT {...}

共1个答案

匿名用户

通过添加字符集来声明完全预期的内容类型:

.andExpect(content().contentType(new MediaType(MediaType.APPLICATION_JSON, StandardCharsets.UTF_8)))

或使用contentTypeCompatibleWith

.andExpect(content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON))

只是一张小纸条;您可以安全地删除@ExtendeWith(SpringExtension.class)注释,因为@SpringBootTest批注已经用给定的批注进行了元批注。