java 在测试类中禁用@CreationTimestamp

p8h8hvxi  于 2023-06-04  发布在  Java
关注(0)|答案(3)|浏览(183)

所以我使用Hibernate的注解@CreationTimestamp@UpdateTimestamp。它工作得很好,但我在单元测试时遇到过这种情况,我需要在特定日期创建对象。
我认为这是不可能的停用这个注解,所以我想到的第一件事是删除它们,并做这样的事情:

@PrePersist
public void prePersist() {
    if (createdDate == null) {
        createdDate = new Date();
    }
}

我不喜欢这种方式,因为我将不得不为一个测试用例对我的实体进行重构。
我认为另一个更好的解决方案是使用我需要的数据创建一个sql文件,并在运行测试之前使用Spring执行它。
你认为做这件事最好的方法是什么?

xfb7svmp

xfb7svmp1#

我在测试中遇到过同样的问题,我想到的最好的解决方案是:模拟Clock.systemUTC中的静态方法,使其返回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
nle07wnf

nle07wnf2#

不要仅仅为了一个测试用例而改变你的产品代码。只是修改测试对象的创建日期属性吗?

zed5wv10

zed5wv103#

在我的例子中,配备了@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);

相关问题