我想测试保存到我的数据库中的循环。
我在内存中设置了一个数据库,我已经加载了我的场景。
我有一个名为BasicInitTest
的基本测试类,如此
RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = CentralApplication.class)
@WebAppConfiguration
@Transactional
@Ignore
public class BasicInitTest {
.......
}
我的所有测试类都扩展了它,每个测试类都有多个@Test
方法。特别是其中一个调用FooServiceImpl.iterateAndSave(List<FooModel>)
,它迭代一个列表并尝试保存单个对象。
保存方法由FooServiceImpl.save(Foo)
执行,注释时使用@Transactional(propagation=Propagation.REQUIRED_NEW)
。此方法在保存槽FooRepository.save(Foo)
之前,尝试查找对象以抛出异常或保存
@Transactional(propagation=Propagation.REQUIRED_NEW)
public Foo save(Foo foo) throws Exception {
Foo f = fooRepository.findById(foo.getId);
if(f) throw new Exception("ex");
return fooRepository.saveAndFlush(foo);
}
就像上面的测试仍然暂停在第一线服务上,而不是@Transactional(propagation=Propagation.REQUIRED_NEW)
,它可以工作。
我必须使用@Transactional
注释以防止FooServiceImpl.iterateAndSave(List<FooModel>)
中的异常,因为它有一个循环来迭代每个模型对象以执行某些操作然后保存对象。
实际上,如果我删除注释,并且保存操作异常,例如ConstraintViolationException
,当下一个对象保存时我会收到此错误
HHH000099: an assertion failure occured (this may indicate a bug in Hibernate, but is more likely due to unsafe use of the session): org.hibernate.AssertionFailure: null id in com.projecy.Foo entry (don't flush the Session after an exception occurs)
如何测试这种情况?