Spring MockMVC 在响应中默认错误的 ContentType
Spring MockMVC defaults wrong ContentType in Response
我刚刚更新了我的应用程序以使用 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
我已经检查过响应中的内容类型实际上是 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)))
.andExpect(content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON))
一个小小的注意事项;您可以安全地删除 @ExtendWith(SpringExtension.class)
注释,因为 @SpringBootTest
注释已经用给定的注释进行了元注释。
我刚刚更新了我的应用程序以使用 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
我已经检查过响应中的内容类型实际上是 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)))
.andExpect(content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON))
一个小小的注意事项;您可以安全地删除 @ExtendWith(SpringExtension.class)
注释,因为 @SpringBootTest
注释已经用给定的注释进行了元注释。