当前位置: 首页 > 知识库问答 >
问题:

Rest Assured不使用自定义ObjectMapper

宦子琪
2023-03-14

我正在使用Rest Assured为我的spring boot项目做控制器测试。我们在序列化对象上使用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());
    }

Item.Class:

@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,所以我们声明了一个ItemRepository接口,它扩展了CrudRepository(Item,Long)(我在这里只是使用了括号,因为stack overflow不喜欢尖括号),控制器调用了调用内置save方法的服务来持久化项并返回持久化项,所以在我的测试中,我希望我发送进来的保存日期在返回时是相同的。

我遇到的主要问题是返回的日期是GMT,而我的期望是它是EST/EDT,因此断言失败,因为zoneddatetime.now()使用了本地时区,但不管出于什么原因,请放心,将时区更改为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.发布
  • com.fasterxml.jackson.core:jackson-DataBind:2.6.4
  • com.fasterxml.jackson.core:jackson-注释: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

共有1个答案

东门晨
2023-03-14

在将RestAssured与mockMVC一起使用时,不应使用RestAssured.configRestAssuredConfig。而是使用io.restassured.module.mockmvc.restassuredmockmvcio.restassured.module.mockmvc.config.restassuredmockmvcconfig。即。替换代码:

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

与:

RestAssuredMockMvc.config = RestAssuredConfigMockMvc.config().objectMapperConfig(
    ...
);
 类似资料:
  • 我正在尝试为PGInterval和Duration编写一个自定义数据类型绑定,以将jOOQ与TimescaleDB一起使用。遗憾的是,jOOQ在为数据库例程生成函数时没有使用它。 这是我的绑定类: 这是我在pom中的配置: 例如,我希望jOOQ生成例程 像 但是我得到了

  • 假设我有一个名为的方法的接口,它接受了的参数。在中有名为和的字段。我想模拟调用此方法的响应,并返回不同的模拟响应结果,只要ServiceRequest中的值不同。 我有以下代码,如follow(参考https://www.baeldung.com/mockito-argument-matchers),但它返回空指针异常。这里出了什么问题?

  • 问题内容: 是否可以使用Java API创建索引并指定自定义分析器?它支持在索引创建时添加映射,但是我找不到不通过HTTP PUT发送JSON的方法来执行以下操作: 我可以使用JSONBuilder构建这样的查询,但是据我所知,我在API中找不到运行它的位置,没有可以使用的任何东西,也没有可以使用的地方。什么是正确的方法? 问题答案: 您可以使用设置分析仪。有几种建立设置的方法。您可以从文本,地图

  • 我正在测试DynamoDB表,希望使用关键字“dev”为prod和dev环境设置不同的表名,用于开发,用于生产。 我有一个POJO 在Prod上,我希望它的名字是abc_xy_Prod_MyProjectName_Employee。 所以,我写了一个TableNameResolver 这是通过创建一个名为abc_xy_prod_MyProjectName_Employee in productio

  • 试图将RedisTemplate bean与GenericJackson2JsonRedisSerializer一起使用,但是在调试时我注意到Spring会话使用了不同的RedisTemplate实例。 当运行这个时,Spring会话似乎对hashValues使用默认的JdkSerializationRedisSerializer,而不是所需的GenericJackson2JSONRedisSer

  • 包的声明和使用非常简单,在了解基本语法之后,下面通过一个案例演示在 Java 程序中声明包,以及不同包之间类的使用。 1)创建一个名为 com.dao 的包。 2)向 com.dao 包中添加一个 Student 类,该类包含一个返回 String 类型数组的 GetAll() 方法。Student 类代码如下: 3)创建 com.test 包,在该包里创建带 main() 方法的 Test 类。