junit Spring MockMvc -从REST获取java.time.Instant

nzkunb0c  于 2023-11-19  发布在  Spring
关注(0)|答案(2)|浏览(107)

我有一个资源,它返回一个具有java.time.Instant属性的对象。

class X {
    ...
    private Instant startDate;
    ...
}

字符串
我正在测试它:

mockMvc.perform(get("/api/x"))
        .andExpect(status().isOk())
        .andExpect(jsonPath("$.content.[*].startDate").value(hasItem(MY_INSTANT_DATE)));


但我从JUnit得到的是:

Expected: a collection containing <2018-06-08T11:46:50.292Z> but: was <1528458378.397000000>


如何将我的Instant日期Map到此格式?

af7jpaap

af7jpaap1#

我通过定制匹配器找到了一个解决方案:

class DateEquals extends BaseMatcher<Integer> {

    private final Date expectedValue;

    DateEquals(Date equalArg) {
        expectedValue = equalArg;
    }

    @Override
    public boolean matches(Object item) {
        Long dateTimeMillis = (Long) item;
        return dateTimeMillis.equals(toEpochMillis(expectedValue));
    }

    @Override
    public void describeTo(Description description) {
        description.appendValue(" equals to date: " + expectedValue);
    }
}

字符串
工厂为它:

public class CustomMatchersFactory {
    public static Matcher dateEquals(Date date) {
        return is(new DateEquals(date));
    }
}


和用法:

.andExpect(jsonPath("$.content.[*].startDate", dateEquals(MY_INSTANT_DATE)));

jm2pwxwz

jm2pwxwz2#

通常,不需要显式Map。如果JacksonMap器被告知将日期写入时间戳,就会发生这种情况。因此,有两个地方需要检查(因为默认情况下此功能是禁用的):

  • 代码
  • 应用性能

关于代码,您可以查看这篇Baeldung文章,其中显示了ObjectMapper调整的可能方法:https://www.baeldung.com/spring-boot-customize-jackson-objectmapper#customizing-the-default-objectmapper
关于应用程序的属性。适当的属性是spring.jackson.serialization.write-dates-as-timestamps,所以要么检查它是否被禁用,要么你可以显式地禁用它(从潜在原因列表中删除这一点):
对于 *.yaml,您可以通过以下方式禁用它:

spring:
  jackson:
    serialization:
      write-dates-as-timestamps: false

字符串
或者如果您使用*.properties文件

spring.jackson.serialization.write-dates-as-timestamps=false

相关问题