使用Instancio为junit测试用例创建带有约束的实体测试对象

问题描述 投票:0回答:1

我正在尝试为实体类创建测试对象。下面是实体类,它具有数据库表中字段的所有约束。

@Entity
@EntityListeners(AuditingEntityListener.class)
@Table(name = "persons", schema = "vetting_service")
@Getter
@Setter
@NoArgsConstructor
@Slf4j
@ToString(onlyExplicitlyIncluded = true)
public class PersonEntity extends AuditableEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    @Null(groups = OnCreate.class)
    @NotNull(groups = OnUpdate.class)
    @ToString.Include
    private Long id;

    @Column(name = "source_person_id")
    @Size(max = Person.SOURCE_ID_MAXLENGTH)
    @ToString.Include
    private String sourcePersonId;

    @Column(name = "first_name")
    @NotBlank
    @Size(max = Person.FIRST_NAME_MAXLENGTH)
    private String firstName;

    @Column(name = "middle_name")
    @Size(max = Person.MIDDLE_NAME_MAXLENGTH)
    @NullOrNotBlank
    private String middleName;

    @Column(name = "last_name")
    @NotBlank
    @Size(max = Person.LAST_NAME_MAXLENGTH)
    private String lastName;

    /**
     * SSN. Not updatable!
     */
    @Column(name = "ssn", length = 72, updatable = false)
    @NotBlank
    @Size(min = Person.SSN_LENGTH, max = Person.SSN_LENGTH)
    @Pattern(regexp = "^\\d{9}$", message = "must be a nine digit string")
    @Convert(converter = AttributeEncryptor.class)
    private String ssn;

    @Column(name = "ssn_last_4", updatable = false)
    @NotBlank
    @Size(max = 4)
    private String ssnLast4;

    @Column(name = "dob")
    @NotNull
    @Past
    private LocalDate dateOfBirth;

    @ElementCollection
    @CollectionTable(name = "addresses", schema = "vetting_service", joinColumns = @JoinColumn(name = "PERSON_ID"))
    @MapKeyEnumerated(EnumType.STRING)
    @PhysicalAddressRequired
    private Map<AddressType, @Valid AddressEmbeddable> addresses = new HashMap<>();

    /**
     * The home phone of the individual to be vetted.
     */
    @ElementCollection
    @CollectionTable(name = "phones", schema = "vetting_service", joinColumns = @JoinColumn(name = "PERSON_ID"))
    @MapKeyEnumerated(EnumType.STRING)
    private Map<PhoneType, @Valid PhoneEmbeddable> phones = new HashMap<>();

    /**
     * The home phone of the individual to be vetted.
     */
    @ElementCollection
    @CollectionTable(name = "email_addresses", schema = "vetting_service", joinColumns = @JoinColumn(name = "PERSON_ID"))
    @MapKeyEnumerated(EnumType.STRING)
    private Map<EmailAddressType, @Valid EmailAddressEmbeddable> emailAddresses = new HashMap<>();

    @SuppressWarnings("checkstyle:magicnumber")
    public void setSsn(@NotNull final String ssn) {
        this.ssn = ssn;
        this.ssnLast4 = StringUtils.right(ssn, 4);
    }

    /**
     * Convenience method to get PHYSICAL address, which can never be null.
     *
     * @return The PHYSICAL address.
     */
    public AddressEmbeddable physicalAddress() {
        return this.addresses.get(AddressType.PHYSICAL);
    }
}

当我尝试使用实例创建测试对象时

final PersonEntity tstPerson = Instancio.of(PersonEntity.class).create();

我没有获取具有长度等限制的数据。生成的名字超出了设置的长度。如何为该对象创建符合约束的数据?

java junit5 instancio
1个回答
0
投票

您可以通过启用几个设置来实现此目的:

PersonEntity person = Instancio.of(PersonEntity.class)
    .withSetting(Keys.BEAN_VALIDATION_ENABLED, true)
    .withSetting(Keys.JPA_ENABLED, true)
    .create();

这些也可以在

instancio.properties
中启用,以避免每次创建对象时手动执行。详细信息请参阅文档:

© www.soinside.com 2019 - 2024. All rights reserved.