为了账号安全,请及时绑定邮箱和手机立即绑定

在测试类中禁用@CreationTimestamp

在测试类中禁用@CreationTimestamp

汪汪一只猫 2024-01-17 16:35:24
所以我使用 Hibernate 的注释@CreationTimestamp和@UpdateTimestamp. 它工作正常,但我在单元测试时遇到这种情况,我需要在特定日期创建对象。我认为不可能停用此注释,因此我想到的第一件事就是删除它们并执行以下操作:@PrePersistpublic void prePersist() {    if (createdDate == null) {        createdDate = new Date();    }}我不喜欢这种方式,因为我必须仅为一个测试用例重构我的实体。我认为更好的另一个解决方案是使用我需要的数据创建一个 sql 文件,并在运行测试之前使用 Spring 执行它。您认为做到这一点的最佳方法是什么?
查看完整描述

3 回答

?
慕妹3146593

TA贡献1820条经验 获得超9个赞

我在测试中遇到了同样的问题,我想出的最佳解决方案是: Mock static method in Clock.systemUTC so it will return Clock.fixed()


try (MockedStatic<Clock> utilities = Mockito.mockStatic(Clock.class)) {

                utilities.when(Clock::systemUTC)

                        .thenReturn(Clock.fixed(Instant.parse("2018-08-22T10:00:00Z"), ZoneOffset.UTC));

                System.out.println(Instant.now()) //here perform actions in past

            }

    System.out.println(Instant.now()) // here perform in current time


查看完整回答
反对 回复 2024-01-17
?
喵喔喔

TA贡献1735条经验 获得超5个赞

就我而言,配备的属性的数据类型@UpdateTimestamp是LocalDateTime. 我是这样解决的:


ShiftLog shiftLog1 = ShiftLog.builder().build();

ShiftLog shiftLog2 = ShiftLog.builder().build();

ShiftLog shiftLog3 = ShiftLog.builder().build();

LocalDateTime thePast = LocalDateTime.of(1979, 4, 3, 6, 45, 31);

try (MockedStatic<LocalDateTime> utilities = Mockito.mockStatic(LocalDateTime.class)) {

   utilities.when(() -> LocalDateTime.now(ArgumentMatchers.any(Clock.class))).thenReturn(thePast);

   repository.save(shiftLog1);

   repository.save(shiftLog2);

}

// Now the @UpdateTimestamp is untouched again.

repository.save(shiftLog3);


查看完整回答
反对 回复 2024-01-17
?
绝地无双

TA贡献1946条经验 获得超4个赞

不要仅仅为了测试用例而更改生产代码。只需修改测试对象上的创建日期属性?



查看完整回答
反对 回复 2024-01-17
  • 3 回答
  • 0 关注
  • 50 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信