Spring MockMVC 在响应中默认错误的 ContentType

Spring MockMVC defaults wrong ContentType in Response

我刚刚更新了我的应用程序以使用 spring-test 5.3.12Junit 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

我已经检查过响应中的内容类型实际上是 application/json 和 Postman,浏览器和大摇大摆

失败的测试示例

@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;

class

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

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

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

或使用contentTypeCompatibleWith:

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

一个小小的注意事项;您可以安全地删除 @ExtendWith(SpringExtension.class) 注释,因为 @SpringBootTest 注释已经用给定的注释进行了元注释。