我试图在出错的情况下测试rollbackin事务的机制。我读了许多类似的主题,但没有什么能帮助我。这是我尝试的:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "file:src/main/webapp/WEB-INF/rest-servlet.xml" })
@Transactional
public class TagDaoImplTest extends DatabaseTestCase {
private static final String FLAT_XML_DATASET = "FlatXmlDataSet.xml";
@Autowired
private TagDao tagDao;
@Autowired
private SessionFactory sessionFactory;
@Before
public void setUp() throws Exception {
DatabaseOperation.REFRESH.execute(getConnection(), getDataSet());
}
@Test
public void testAddWithRollback() throws Exception {
addWithRollback("testTagToAdd"); //i suppouse that we tried to add, but somthing went wrong and transaction was rolled back
final Tag testTagToAdd = tagDao.findByTag("testTagToAdd"); // so db must be without changes and i check this
assertNull(testTagToAdd);
}
@Rollback(true) //i want this method to rollback after its work to imitate corrupted transaction
private void addWithRollback(String tag) throws Exception {
tagDao.add(new Tag(tag));
}
}
我的dao看起来像这样:
@Repository("tagDao")
public class TagDaoImpl implements TagDao {
@Override
public void add(Tag tag) {
final Session session = sessionFactory.getCurrentSession();
session.persist(tag);
}
}
但是我的测试失败了,因为它在db中找到了标记(这意味着事务没有被回滚)。我尝试了许多不同的东西,如获取当前会话和事务,并手动调用回滚,但没有任何事情发生。你能帮我吗?
答案 0 :(得分:0)
首先,对我来说,尝试测试存储库层感觉有点奇怪。通常不应该有任何业务逻辑,因此这意味着您尝试测试已经测试了数百万次的Hibernate或SQL,并且没有必要这样做。
我建议用这样的方法注释你的方法:
@Transactional(rollbackFor=Exception.class)
并且可能指定例外。然后在测试中,您将以此方法抛出此异常的方式准备系统。因此应该回滚它,不应该更改任何数据。
此外,我想补充一点,实际上加载弹簧上下文在这一点上最可能与生产上下文不同。因此,这是一个额外的观点,我会说没有必要这样做。至少在存储库层上。