本质上是一个关于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.任何评论都会非常棒。
感谢。
答案 0 :(得分:2)
SpringJUnit4ClassRunner
在与测试方法相同的事务中执行@Before
和@After
。因此,在运行测试方法之前,@Before
中的持久性上下文中所做的更改不会刷新到数据库中。在执行查询之前的隐式刷新也不会发生,因为事务被配置为只读。
所以,你有几个选择:
readOnly = true
,它应该在执行查询之前启用自动刷新flush()
添加到@Before
,即使交易是只读的,它也应强制刷新@BeforeTransaction
代替@Before
。请注意,此方法在事务之外运行,因此它不受defaultRollback
设置的影响,并且需要手动事务管理。答案 1 :(得分:0)
我认为这是因为你有defaultRollback = true。
事务围绕单个方法调用,在这种情况下意味着setUp和您的测试在不同的事务中。
尝试将其更改为false,甚至删除它。