亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在測試類中禁用@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 關注
  • 248 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號