标记为@Transactional的单元测试通过,但未标记为失败

dst*_*arh 2 java junit spring hibernate jpa

这样设置JUNIT测试

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({ "/applicationContext.xml", "/applicationContext-security.xml" })
@TransactionConfiguration(defaultRollback = true)
@Transactional
public class BlahIntegrationTests{

 @Test
 public void testMappingsOfHugeObjectGraph(){
 }
}
Run Code Online (Sandbox Code Playgroud)

我试图测试我的休眠映射(基于注释的驱动和基于JPA的)是正确的,并且在运行时如上述测试通过(只是断言一个ID已创建)。

如果我@Transactional走开了,我的某些关系会出现错误,这是我所期望的。有人想过为什么它不会失败@Transactional吗?

编辑:为澄清起见,在保存对象时引发的异常是关于错误的休眠映射(这是一个非常大的对象结构,我已经厌倦了其中的一些对象)

Fra*_*man 5

如果删除@Transactional,则测试数据库将不会为另一个测试所用,因此不会隔离测试。

如果有,那里的某些测试可能会通过,即使它们失败了(如您所描述的,或者另一个示例是,如果您插入的实体重复了一些唯一的约束)。

解决方案是在其位置添加@Transactional并注入

@PersistenceContext
private EntityManager em;
Run Code Online (Sandbox Code Playgroud)

从数据库中提取数据之前,请执行以下操作

em.flush();
em.clear();
Run Code Online (Sandbox Code Playgroud)

第一行将导致会话和数据库之间的同步(您的提供程序通常等待到事务结束)。第二行将从会话中删除所有实体,因此所有查询都将进入数据库。

在测试之后,所有内容仍会回滚,因此您的数据库处于原始状态。

希望能帮助到你。