mockito 如何在单元测试中比较新的Date?

jchrr9hc  于 2022-11-08  发布在  其他
关注(0)|答案(4)|浏览(202)

我有service,方法是:

Entity entity = new Entity(new Date(), 1, 2L);
return entityRepository.save(entity);

还有我的考验:

@Test
public void testSaveEntity() {
    Entity entity = new Entity(new Date(), 1, 2L);
    entityService.saveEntity(1, 2L);
    verify(entityRepository, times(1)).save(entity);
}

如果Entityequals()未比较Date,则一切正常,但如果比较Date,则测试会抛出Argument(s) are different!

dfuffjeb

dfuffjeb1#

据我所知,不可能更改服务和实体,那么在这种情况下,最好在Mockito中使用ArgumentMatcher<>

步骤1:

@AllArgsConstructor
public class EntityMatcher implements ArgumentMatcher<Entity> {

    private Entity left;

    @Override
    public boolean matches(Entity right) {
        return (left.getEventDate().getTime() - right.getEventDate().getTime() <= 1000));
    }
}

在这里你可以把equals作为比较对象。mathces可以是ovveride。我认为一秒钟的差别就足够了。

步骤2:

verify(entityRepository).save(argThat(new EntityMatcher(new Entity(new Date(), 1, 2L))));

**其他情况:**在其他测试中,很可能会出现这种情况,即此entity也需要检查when

when(entityRepository.save(any(Entity.class))).thenReturn(new Entity(new Date(), 1, 2L));
2eafrhcq

2eafrhcq2#

您有两个选项:

选项1:使用Clock类控制时间

不要使用new Date()

  • Clock示例注入到服务中
  • 使用其方法检索当前时间
  • 在测试代码中,使用Clock.fixed控制当前时间

请参阅Guide to the Java Clock Class

选项1:放宽匹配要求

使用Mockito ArgumentMatchers来放宽匹配要求-使用any(YourEntity.class)来匹配任何YourEntity,或为实体编写自定义参数匹配器。

bpsygsoo

bpsygsoo3#

equals方法的定义可能有问题。您应该定义在何种情况下两个不同的实体被视为相等:

**只有当两个实体的日期值在相同的范围内时,它们才相等

毫秒,还是我们只关心秒、分钟或天?**
与处理浮点值类似,此可接受的差异可以类似于Calculating the difference between two Java date instances进行计算

ubof19bj

ubof19bj4#

不要依赖解决方案中使用的equals方法:

verify(entityRepository, times(1)).save(entity);

您可以尝试捕获参数并在下一步中Assert它,如Verify object attribute value with mockito中所述

ArgumentCaptor<Entity> argument = ArgumentCaptor.forClass(Entity.class);
verify(entityRepository, times(1)).save((argument.capture());
assertEquals(1, argument.getValue().getWhatever());

相关问题