繁体   English   中英

Junit 测试场景不执行回滚

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM