[英]Junit test scenario doesn't perform rollback
我有以下测试,我需要证明我的事务有效并且可以回滚。 这里的问题是我的 RuntimeException 是在数据输入数据库之前执行的。 所以回滚不会发生。 如何设置此测试?
@Test
@Rollback(true)
public void testForTransactionRollback() throws ClassNotFoundException, SQLException {
User user = new User();
user.setFirstName("Ivan");
user.setLastName("Ivanov");
user.setPhoneNumber("18000000");
user.setEmail("mail@gmail.com");
user.setCardNumber("4111111111111111");
user.setDeliveryAddress("address");
user.setComment("comment");
String result = "";
final ClientDAO clientDao1 = Mockito.spy(new ClientDAOImpl());
final ClientDAOImpl clientDaoImpl = (ClientDAOImpl) clientDao1;
Mockito.when(clientDao1.insert(user)).thenThrow(new RuntimeException());
try {
clientDao1.insert(user);
} catch (final RuntimeException e) {
System.out.println("Expected failure to trigger transaction caught");
} finally {
user = clientDao1.get(1L);
if (user != null) {
result = user.getFirstName();
}
}
Assert.assertEquals("it should be equal", "", result);
}
我认为您面临的问题是由两个内部事务(一个在另一个内部)引起的:第一个在clientDao1.insert(user)
内部,第二个在您的测试内部(前提是您使用@Transactional
或@DataJpaTest
,但您没有显示)。 如果在内部事务中抛出RuntimeException
,这是因为
Mockito.when(clientDao1.insert(user)).thenThrow(new RuntimeException());
那么这意味着您的内部clientDao1.insert
方法无法从该异常中恢复,而外部方法(测试方法)无话可说。
这就是为什么数据永远不会被写入数据库甚至是持久化的原因(当然,如果您使用 hibernate 作为 JPA 提供程序,则为休眠缓存)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.