在测试类中禁用@CreationTimestamp

所以我使用 Hibernate 的注释@CreationTimestamp和@UpdateTimestamp. 它工作正常,但我在单元测试时遇到这种情况,我需要在特定日期创建对象。


我认为不可能停用此注释,因此我想到的第一件事就是删除它们并执行以下操作:


@PrePersist

public void prePersist() {

    if (createdDate == null) {

        createdDate = new Date();

    }

}

我不喜欢这种方式,因为我必须仅为一个测试用例重构我的实体。


我认为更好的另一个解决方案是使用我需要的数据创建一个 sql 文件,并在运行测试之前使用 Spring 执行它。


您认为做到这一点的最佳方法是什么?


汪汪一只猫
浏览 150回答 3
3回答

慕妹3146593

我在测试中遇到了同样的问题,我想出的最佳解决方案是: Mock static method in Clock.systemUTC so it will return Clock.fixed()try (MockedStatic<Clock> utilities = Mockito.mockStatic(Clock.class)) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; utilities.when(Clock::systemUTC)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .thenReturn(Clock.fixed(Instant.parse("2018-08-22T10:00:00Z"), ZoneOffset.UTC));&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println(Instant.now()) //here perform actions in past&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; System.out.println(Instant.now()) // here perform in current time

喵喔喔

就我而言,配备的属性的数据类型@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)) {&nbsp; &nbsp;utilities.when(() -> LocalDateTime.now(ArgumentMatchers.any(Clock.class))).thenReturn(thePast);&nbsp; &nbsp;repository.save(shiftLog1);&nbsp; &nbsp;repository.save(shiftLog2);}// Now the @UpdateTimestamp is untouched again.repository.save(shiftLog3);

绝地无双

不要仅仅为了测试用例而更改生产代码。只需修改测试对象上的创建日期属性?
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java