Spring 运行update/delete命令时JUnit中的单元测试失败

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

我目前正在使用spring和hibernate开发Java中的API实现

我的模型包里有两张桌子

具有OneToMany映射的用户和用户详细信息

@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);
}