java - 在 Spring Junit 测试中,如何使用默认 rollback=true 测试级联操作

标签 java spring junit

这是我的一个示例测试用例,其中 A 与 B 具有一对多关系。现在,我将 B 的实例添加到 Bs A 列表中,并对 A 的实例执行 SaveOrUpdate,但测试用例在以下情况下失败:因为未生成 B 实例的 ID,所以回滚为 true。 当 Rollback 为 false 时它会通过,但随后条目也会添加到数据库中。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
@WebAppConfiguration
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class,
    TransactionalTestExecutionListener.class,DbUnitTestExecutionListener.class})
@TransactionConfiguration(transactionManager="transactionManager",defaultRollback=true)
@Transactional(propagation=Propagation.REQUIRED)
public class Test1 {

    @Autowired
    DummyDao dummyDao;
    @Test
//  @Rollback(false)
    public void newTest2(){
        //      A temp=dummyDao.getAById(new Long(1));
        A temp=dummyDao.getAs().get(0);
        Hibernate.initialize(temp.getBs());
    B class2=new B();
    temp.getBs().add(class2);
    dummyDao.saveA(temp);
    assertNotNull(class2.getId());
}
}

A类详情

import java.util.List;  
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import org.hibernate.annotations.IndexColumn;
@Table(name="UJJWAL_DUMMY", schema="dbo")
@Entity
public class A {
    @Id
    @Column
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
@Column
private String prop;

@OneToMany(fetch=FetchType.LAZY)
@Cascade({CascadeType.ALL})
@JoinColumn(name="fk_A")
@IndexColumn(name="idx")
private List<B> Bs;
// Setter and getters
}

B类详情 @实体 公共(public) B 类{

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column
private Long id;

@Column
private String dummyColumn2;
// Setters and Getters
}

最佳答案

在检查 ids 值之前,您是否尝试过手动刷新数据库更改?如果id是在数据库中生成的,则在设置之前需要进行flush。 @GenerateValue(strategy=GenerationType.AUTO) 通常默认为 ID 类型的列,该列是在数据库中自动生成的编号。

关于java - 在 Spring Junit 测试中,如何使用默认 rollback=true 测试级联操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19420506/

相关文章:

java - 使用Java Spring电子邮件发送电子邮件

java - Hazelcast Spring 配置

java - Jenkins - 选择测试

java - 如何在不阻塞 UI 的情况下在屏幕上显示值并使其在 Android Activity 中以样式淡出?

java - 为什么会发生这种情况?

java - 将对模型元素(jlist)所做的更改更新到 mysql 数据库,问题

java - createNativeQuery 中的分页

java - 为什么 JUnit 测试方法需要无效?

java - Hibernate + JUnit 多线程综合测试

java - 使用 IKVM 生成的 DLL