【发布时间】:2020-11-24 19:05:42
【问题描述】:
我有以下测试,我需要证明我的事务有效并且可以回滚。这里的问题是我的 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);
}
【问题讨论】:
-
为什么你的测试用例用
Rollback(true)注解?我假设你想在你的生产代码中测试一个实际的方法,否则这个测试实际上只会证明你的测试能够执行回滚。您应该调用负责处理事务的方法,确保它失败,然后断言数据库中没有更新任何内容。
标签: java spring junit transactions