gpt4 book ai didi

spring-boot - Rest Assured 不使用自定义 ObjectMapper

转载 作者:行者123 更新时间:2023-12-02 03:59:13 28 4
gpt4 key购买 nike

我正在使用 Rest Assured 为我的 Spring Boot 项目进行 Controller 测试。我们在序列化对象上使用 Java 8 ZonedDateTime 字段,并使用 Jackson 2 进行序列化。运行项目时,序列化按预期工作,但运行放心测试时,日期未正确序列化。我知道 Rest Assured 使用自己的 ObjectMapper 配置,但我的问题是,无论我做什么,Rest Assured 似乎都会忽略我的 ObjectMapper 配置。

以下是我的测试的相关部分:

@RunWith(SpringRunner.class)
@SpringBootTest(classes=MyApplication.class)
@WebAppConfiguration
@Transactional
public class MAppControllerTest {

@Autowired
private WebApplicationContext context;

private MockMvc mockMvc;

@Before
public void setUp() throws Exception {

RestAssured.config = RestAssuredConfig.config().objectMapperConfig(
ObjectMapperConfig.objectMapperConfig().jackson2ObjectMapperFactory(new Jackson2ObjectMapperFactory() {
@SuppressWarnings("rawtypes")
@Override
public ObjectMapper create(Class cls, String charset) {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new JavaTimeModule());
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
objectMapper.setTimeZone(TimeZone.getTimeZone("America/New_York"));
objectMapperconfigure(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE, true);
return objectMapper;
}
})
);

mockMvc = MockMvcBuilders.webAppContextSetup(context)
.apply(springSecurity())
.build();
}

@Test
@WithMockUser(roles = {"APP_ADMIN"}, username = "TEST_USER")
@Sql(scripts = "/db-scripts/test-data.sql")
public void testCreateItem() {
Item postBody = new Item();
postBody.setDate(ZonedDateTime.now());

Item result =
given().
mockMvc(mockMvc).
contentType(ContentType.JSON).
body(postBody).
log().all().
when().
post("/items").
then().
log().all().
statusCode(201).
body(matchesJsonSchemaInClasspath("json-schemas/item.json")).
extract().as(Item.class);

assertThat(result.getDate(), equalTo(postBody.getDate());
}

项目.类:

@Data
@Entity
@Table(name = "ITEM", schema = "MY_APP")
@EqualsAndHashCode(of = "id")
@NoArgsConstructor
@AllArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class Item implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "ITEM_ID_SEQ")
@SequenceGenerator(name = "ITEM_ID_SEQ", sequenceName = "MY_APP.ITEM_ID_SEQ")
private Long id;

@Column(name = "DATE")
private ZonedDateTime date;
}

我们使用的是 spring-boot-starter-data-jpa,所以我们刚刚声明了一个扩展 CrudRepository(Item, Long) 的 ItemRepository 接口(interface)(我只是在这里使用了括号,因为堆栈溢出不喜欢尖括号)并且 Controller 调用服务,该服务调用内置的保存方法来持久化项目并返回持久化的项目,因此在我的测试中,我期望我发送的保存日期与返回时的日期相同。

我遇到的主要问题是返回的日期是 GMT,而我的期望是 EST/EDT,因此断言失败,因为 ZonedDateTime.now() 使用本地时区,但无论出于何种原因,Rest Assured 正在将时区更改为 GMT:

java.lang.AssertionError:
Expected: <2017-03-30T14:53:19.102-04:00[America/New_York]>
but: was <2017-03-30T18:53:19.102Z[GMT]>

还有一个日期甚至没有被序列化为 ISO,而是一种奇怪的小数。不知道这是怎么回事,但项目运行时不会发生这种情况;这些问题都没有。仅当运行放心测试时才会出现这种情况。

无论我在测试设置中配置什么 ObjectMapper,我都会收到此错误...无论我是否有 ObjectMapper,它都会被完全忽略。

相关技术版本:

  • Spring Boot:1.5.2.RELEASE
  • com.fasterxml.jackson.core:jackson-databind: 2.6.4
  • com.fasterxml.jackson.core:jackson-annotations: 2.6.4
  • com.fasterxml.jackson.core:jackson-core: 2.6.4
  • com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.6.4
  • com.jayway.restassured:rest-assured: 2.9.0
  • com.jayway.restassured:json-schema-validator:2.9.0
  • com.jayway.restassured:spring-mock-mvc: 2.9.0

最佳答案

将 RestAssured 与 MockMvc 结合使用时,不应使用 RestAssured.configRestAssuredConfig。请改用 io.restassured.module.mockmvc.RestAssuredMockMvc 和 io.restassured.module.mockmvc.config.RestAssuredMockMvcConfig。 IE。替换您的代码:

RestAssured.config = RestAssuredConfig.config().objectMapperConfig(
...
);

与:

RestAssuredMockMvc.config = RestAssuredConfigMockMvc.config().objectMapperConfig(
...
);

关于spring-boot - Rest Assured 不使用自定义 ObjectMapper,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43127485/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com