Spring 运行update/delete命令时JUnit中的单元测试失败
我目前正在使用spring和hibernate开发Java中的API实现 我的模型包里有两张桌子 具有OneToMany映射的用户和用户详细信息Spring 运行update/delete命令时JUnit中的单元测试失败,spring,hibernate,junit,hsqldb,Spring,Hibernate,Junit,Hsqldb,我目前正在使用spring和hibernate开发Java中的API实现 我的模型包里有两张桌子 具有OneToMany映射的用户和用户详细信息 @Entity public class User { private Long id; private String userId; private Set<UserDetail> userDetails; @OneToMany(cascade = CascadeType.ALL, orphanRemov
@Entity
public class User {
private Long id;
private String userId;
private Set<UserDetail> userDetails;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "user")
public Set<UserDetail> getUserDetails() {
return userDetails;
}
public void setUserDetail(Set<UserDetail> userDetails) {
this.userDetails = userDetails;
}
}
@Entity
public class User {
private Long id;
private String key;
private String value;
private User user;
@ManyToOne
@JoinColumn(name = "USER_ID", nullable = false)
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
我编写了Junit测试用例来测试用户UserDetails的添加和删除,我的addUserDetail正常工作,但是当我调用delete时,更改没有反映出来,并且失败了
下面是我的测试用例
@Test
public void testDeletUserDetail() throws Exception {
//GIVEN
String userId = client.newUser().call(getCreateUserRequest()).getId();
client.newAddUserDetail().call(getAddUserDetailRequest(userId, "key1", "value1"));
client.newAddUserDetail().call(getAddUserDetailRequest(userId, "key2", "value2"));
//WHEN
client.newDeteteUserDetail().call(getDeleteUserDetailRequest(userId, "key2"));
//THEN
List<UserDetail> userDetails = client.newGetUserDetail().call(getGetUserDetailRequest(userId));
assertEquals(userDetails.size(), 1); // This check fails and says it has a size of 2 instead of 1.
}
所有存储库都扩展了JpaRepository
谁能解释一下如何回避这个问题
任何帮助都将不胜感激 似乎您的测试对象可能有多个用户详细信息;第一个测试解决了这个问题,第二个没有。您是否尝试打印出这些对象?返回的对象有两个条目,但它应该只有一个带有key=“key1”的条目,因为前面的delete命令已删除了一个条目@uwealn或者您可能有其他单元测试在处理数据?由于它们是以不可预测的顺序执行的,您是否确保每个都有干净的环境(干净的数据库等)?它由@Transaction注释,因此所有更改都会在测试完成后恢复,有许多测试,当我尝试在数据库上调用SELECT afer DELETE操作时,会发生此特定实例。
@Test
public void testDeletUserDetail() throws Exception {
//GIVEN
String userId = client.newUser().call(getCreateUserRequest()).getId();
client.newAddUserDetail().call(getAddUserDetailRequest(userId, "key1", "value1"));
client.newAddUserDetail().call(getAddUserDetailRequest(userId, "key2", "value2"));
//WHEN
client.newDeteteUserDetail().call(getDeleteUserDetailRequest(userId, "key2"));
//THEN
List<UserDetail> userDetails = client.newGetUserDetail().call(getGetUserDetailRequest(userId));
assertEquals(userDetails.size(), 1); // This check fails and says it has a size of 2 instead of 1.
}
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan" value="com.iiitd.myAPI.model" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="database" value="HSQL" />
<property name="generateDdl" value="true" />
<property name="showSql" value="false" />
</bean>
</property>
</bean>
<jdbc:embedded-database id="dataSource" type="HSQL" />
// This one works in both jUnit and manual testing
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Throwable.class)
public void deleteUserDetail(DeleteUserDetailRequest request) {
User user = userRepository.findByUserId(request.getUserId());
if(!CollectionUtils.isEmpty(user.getUserDetail())) {
UserDetail toRemove = null;
for(UserDetail userDetail : user.getUserDetail()) {
if(StringUtils.equals(userDetail.getKey(), request.getDeleteKey())) {
toRemove = userDetail;
}
}
Assert.notNull(toRemove, "Detail user doesn't exist.");
user.getUserDetail().remove(toRemove);
userRepository.save(user);
}
}
//This one doesn't and unit tests fails but manual tests are OK
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Throwable.class)
public void deleteUserDetail(DeleteUserDetailRequest request) {
UserDetail userDetail = userDetailRepository.getUserDetail();
Assert.notNull(userDetail, "Detail doesn't exists");
userDetailRepository.delete(userDetail);
}