java - Mockito 单元测试 - 时间戳不同

标签 java unit-testing mockito

Mockito 测试有一些问题。

我目前收到此错误:

Argument(s) are different! Wanted:
repository.save(
    uk.co.withersoft.docservice.repositories.hibernate.MetaDataEntity@3e437e6c
);
-> at uk.co.withersoft.docservice.datastore.impl.MetaDataStoreImplTest.storeClaimMetadata(MetaDataStoreImplTest.java:55)
Actual invocation has different arguments:
repository.save(
    uk.co.withersoft.docservice.repositories.hibernate.MetaDataEntity@3e361ee2
);

我很确定这是因为 MetaDataEntity 中的时间不同

//这是我应该得到的

id = null
metaData = "{"caseReference":"CN00000001","claimReference":"LN00000001","rpsDocumentType":"REJ","documentTitle":"Claims LN00000001 (Claimant: Mr LOCAL HOST) REJ-Rejection letter"}"
batchId = 0
state = "Saved MetaData to DB"
lastUpdatedDate = {Timestamp@1517} "2018-07-25 18:39:21.993"
createdDate = {Timestamp@1518} "2018-07-25 18:39:21.993"

//这实际上是我得到的。

id = null
metaData = "{"caseReference":"CN00000001","claimReference":"LN00000001","rpsDocumentType":"REJ","documentTitle":"Claims LN00000001 (Claimant: Mr LOCAL HOST) REJ-Rejection letter"}"
batchId = 0
state = "Saved MetaData to DB"
lastUpdatedDate = {Timestamp@1530} "2018-07-25 18:39:49.274"
createdDate = {Timestamp@1531} "2018-07-25 18:39:52.716"

这是我的测试用例:

@Test
    public void storeClaimMetadata () throws JsonProcessingException {

        ClaimMetaData metaData = constructMetaData();

        MetaDataEntity mockResponseMetaDataEntity = new MetaDataEntity();
        mockResponseMetaDataEntity.setId(1);

        when(repository.save(any(MetaDataEntity.class))).thenReturn(mockResponseMetaDataEntity);

        Integer result = testSubject.storeClaimMetadata(metaData);

        assertEquals(Integer.valueOf(1), result);

        final ObjectMapper mapper = new ObjectMapper();
        String jsonMetaData = mapper.writeValueAsString(metaData);

        MetaDataEntity expectedMetaDataEntity = new MetaDataEntity(null,
                                                                   jsonMetaData,
                                                                   0,
                                                                   "Saved MetaData to DB",
                                                                   new Timestamp(System.currentTimeMillis()),
                                                                   new Timestamp(System.currentTimeMillis()));

        Mockito.verify(repository, times(1)).save(expectedMetaDataEntity);
    }

    //Creates a ClaimRequest
    private ClaimMetaData constructMetaData() {
        final ClaimMetaData metaData  = new ClaimMetaData("CN00000001",
                                                          "LN00000001",
                                                          "REJ",
                                                          "Claims LN00000001 (Claimant: Mr LOCAL HOST) REJ-Rejection letter");

        return metaData;
    }

任何帮助将不胜感激。这让我发疯!!

最佳答案

这正是人们使用依赖注入(inject)的原因,因此他们可以指定返回可预测结果的测试协作者。将硬编码的 new Timestamp(System.currentTimeMillis) 内容替换为对 Timestamp.from(Instant.now(clock)) 的调用。

java.time.Clock 是一个可用于获取时间戳值的接口(interface)。可以使用返回系统时钟的工厂方法之一将真正的实现注入(inject)到被测试的代码中,如下所示(使用 Spring Java 配置):

@Bean
public Clock clock() {
    return Clock.systemDefaultZone();
}

对于测试代码,您可以在其中指定希望时钟返回的时间:

@Before 
public void setUp() {
    clock = Clock.fixed(date.toInstant(), ZoneId.of("America/NewYork"));
    systemUnderTest.setClock(clock);
}

关于java - Mockito 单元测试 - 时间戳不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51524918/

相关文章:

java - 如何使用 Mockito 验证带有 ByteBuffer 参数的调用?

java - Mockito:模拟泛型类型类的方法调用

java - JPA2 : @Min constraint for float

java - Java 省略号需要堆分配吗?

java - 如何从 REST Web 服务读取规范

Java 到 WSDL 数据类型

javascript - 单元测试时刻日期 - 内存地址问题?

c# - 您如何对 ASP.NET Core Web 应用程序(.Net Framework)进行单元测试?

java - Android 数据绑定(bind)测试在模块 NoClassDefFoundError 中失败

java - 验证 Mockito 中同一方法的后续调用的参数