测试:在数据库中创建但未找到的实体

时间:2012-02-06 10:17:17

标签: hibernate spring junit

本质上是一个关于JUnit测试的问题,你在@Before方法中创建一个实体,但是在实际的测试方法中找不到它。我一直试图找出正在发生的事情,任何形式的帮助都会非常感激。

本质上它是一个像这样的JUnit类:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"myConfiFile.xml"})
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
@Transactional
public class DummyTest {

@Before
public void setUp() {
    // Create an entity here and call .save()
}

@Test
public void testCountMsisdnNumberPlans() {
    int howManyInstances = dao.countInstancesOfEntity();
}
}

DAO代码非常简单:

@Transactional(readOnly = true)
public Integer countInstancesOfEntity(Integer idhlr) {
    return ((BigDecimal) em.createNativeQuery("SELECT COUNT(*) FROM ENTITY")
        .getSingleResult()).intValue();
}

在setUp()中我们创建了一个实体,但DAO代码一直返回0.任何评论都会非常棒。

感谢。

2 个答案:

答案 0 :(得分:2)

SpringJUnit4ClassRunner在与测试方法相同的事务中执行@Before@After。因此,在运行测试方法之前,@Before中的持久性上下文中所做的更改不会刷新到数据库中。在执行查询之前的隐式刷新也不会发生,因为事务被配置为只读。

所以,你有几个选择:

  • 删除readOnly = true,它应该在执行查询之前启用自动刷新
  • 将明确flush()添加到@Before,即使交易是只读的,它也应强制刷新
  • 使用@BeforeTransaction代替@Before。请注意,此方法在事务之外运行,因此它不受defaultRollback设置的影响,并且需要手动事务管理。

答案 1 :(得分:0)

我认为这是因为你有defaultRollback = true。

事务围绕单个方法调用,在这种情况下意味着setUp和您的测试在不同的事务中。

尝试将其更改为false,甚至删除它。