我在測驗 Jpa 的保存操作時遇到問題。
我有一個用戶物件:
@Entity
@Table(name = "USERS", schema = "ecommercy")
@EntityListeners(AuditingEntityListener.class)
@JsonIgnoreProperties(value = {"createdAt", "updatedAt"}, allowGetters = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
@ToString
public class User {
@Id
@GeneratedValue(generator = "uuid2")
@GenericGenerator(name = "uuid2", strategy = "org.hibernate.id.UUIDGenerator")
@Column(updatable = false, nullable = false, columnDefinition = "VARCHAR(255)")
private String id;
@Column(unique = true, nullable = false)
private String email;
@Column(unique = true)
private String phoneNumber;
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
@Column(nullable = false)
private String password;
@Column(nullable = false)
private String name;
private String lastName;
@OneToMany(mappedBy = "user")
@Cascade(org.hibernate.annotations.CascadeType.ALL)
private List<Address> addresses;
@OneToOne(mappedBy = "user")
@Cascade(org.hibernate.annotations.CascadeType.ALL)
private Basket basket;
@OneToMany(mappedBy = "user")
@Cascade(org.hibernate.annotations.CascadeType.ALL)
private List<Order> orders;
@Builder.Default
@Column(nullable = false)
private int points = 0;
@OneToMany(mappedBy = "user")
@Cascade(org.hibernate.annotations.CascadeType.ALL)
private List<Comment> comments;
@Builder.Default
@Convert(converter = StringListConverter.class)
@Column(updatable = false)
private List<String> roles = List.of("USER");
@Builder.Default
@Temporal(TemporalType.TIMESTAMP)
@CreatedDate
@Column(nullable = false, updatable = false)
private Date createdAt = new Date();
@Builder.Default
@Column(nullable = false)
@Temporal(TemporalType.TIMESTAMP)
@LastModifiedDate
private Date updatedAt = new Date();
}
如您所見,某些用戶欄位(例如姓名或電子郵件)具有 @Column(unique = true) 或 @Column(nullable = false)
當我運行該應用程式時,一切正常并且運行良好。
但是當我嘗試通過 Junit5 測驗這兩個注釋時,什么都不會發生,也不會拋出例外并且測驗將成功通過。
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
public class UserRepositoryTests {
@Autowired
private UserRepository userRepository;
@Test
void ifEmailIsNullMustThrowException() {
// Arrange
User user = User.builder()//
.name("John")//
.lastName("Doe")//
.password("password")//
.phoneNumber("123456789")//
.build();
// Act
User savedUser = userRepository.save(user);
// Assert
assertNull(savedUser);
}
@Test
void ifAUserExistWithGivenEmailMustThrowException() {
// Arrange
User user1 = User.builder()//
.name("John")//
.lastName("Doe")//
.email("[email protected]")//
.password("password")//
.phoneNumber("123456789")//
.build();
User user2 = User.builder()//
.name("John")//
.lastName("Doe")//
.email("[email protected]")//
.password("password")//
.phoneNumber("123456789")//
.build();
userRepository.save(user1);
// Act
User savedUser = userRepository.save(user2);
// Assert
assertNull(savedUser);
}
}
uj5u.com熱心網友回復:
這@DataJpaTest使您的測驗@Transactional,這意味著測驗中的所有內容都在事務中運行,并將在測驗后回滾。這與 AUTO 的默認重繪 模式(將在提交時自動重繪 )相結合,使得在您的測驗中不會對資料庫產生任何實際的 SQL 問題。(啟用查詢日志會顯示這一點)。如果沒有對資料庫的 SQL,則不會觸發任何約束,因此也不例外。
要修復你可以做兩件事。
- 使用
saveAndFlush代替save,因為這將重繪 對資料庫的更改并因此發出 SQL。 - 注入
TestEntityManager并在所有呼叫之后,在斷言之前呼叫該flush方法,以便將更改同步到資料庫并發出 SQL。
兩者都可以作業,因為它會觸發更改的重繪 。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/490407.html
標籤:爪哇 弹簧靴 jpa junit5 数据-jpa-测试
上一篇:如何將“FirstnameLastnameFirstname2Lastname2”拆分為“FirstnameLastname”“Firstname2Lastname2”?
下一篇:JPAsave()不更新現有行
