如何重写单元测试的jpa@prepersist行为

kcugc4gi  于 2021-07-07  发布在  Java
关注(0)|答案(1)|浏览(276)

我拥有以下jpa实体:

@Entity
@Builder
@Table(name = "My_Table")
public class MyTableEntity {

    @Column(name = "id")
    private long id;

    @Column(name = "creationdatetime")
    private LocalDateTime creationDateTime;

    @Column(name = "updatedatetime")
    private LocalDateTime updateDateTime;

    @PrePersist
    protected void onCreate() {
    this.creationDateTime = LocalDateTime.now();
        this.updateDateTime = LocalDateTime.now();
    }
}

我做了一个单元测试:

LocalDateTime creationDate = LocalDateTime.now().minusDays(100);
   MyTableEntity entity = 
   MyTableEntity.builder()
           .id(1)
           .build();
   entity.setCreationDateTime(creationDate)
   entity.setUpdateDateTime(creationDate)

但是,稍后在我的单元测试中,我为creation date time和update date time设置的值会根据 @PrePersist 方法。
仅仅为了单元测试,我怎么能停止 @PrePersist 从重写我在单元测试期间显式设置的值开始?
(如果有帮助,我正在使用mockito。)

xwbd5t1u

xwbd5t1u1#

最简单的方法是在 MyTableEntity#onCreate 方法:

@PrePersist
protected void onCreate() {
    if(creationDateTime == null){
        this.creationDateTime = LocalDateTime.now();
    }
    if(updateDateTime == null){
        this.updateDateTime = LocalDateTime.now();
    }
}

那么您在单元测试中设置的值就不会被重写。
另一个选择是通过 onCreate 来自外部的代码。

@Entity
@Builder
@Table(name = "My_Table")
public class MyTableEntity {

    ///  ... 

    @Transient
    private Consumer<MyTableEntity> onCreateConsumer = mte -> {
        mte.creationDateTime = LocalDateTime.now();
        mte.updateDateTime = LocalDateTime.now();
    };

    @PrePersist
    protected void onCreate() {
        onCreateConsumer.accept(this);
    }
}

然后可以在单元测试中设置oncreateconsumer:

MyTableEntity.builder()
   .id(1)
   .onCreateConsumer(e -> {}) // do nothing
   .build();

相关问题