Java Junit测试场景没有';不执行回滚

Java Junit测试场景没有';不执行回滚,java,spring,junit,transactions,Java,Spring,Junit,Transactions,我有下面的测试,我需要证明我的事务工作正常并且可以回滚。这里的问题是我的RuntimeException是在数据输入数据库之前执行的。所以回滚不会发生。如何设置此测试 @Test @Rollback(true) public void testForTransactionRollback() throws ClassNotFoundException, SQLException { User user = new User(); user.setFirstName("

我有下面的测试,我需要证明我的事务工作正常并且可以回滚。这里的问题是我的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)).thenthow(newruntimeexception());
这就意味着您的内部
clientDao1.insert
方法无法从该异常中恢复,而外部方法(testone)则无话可说


这就是为什么数据永远不会写入数据库,甚至不会持久化(如果您使用hibernate作为JPA提供程序,当然是hibernate缓存)。

为什么您的测试用例用
回滚(true)
注释?我假设您想在生产代码中测试一个实际的方法,否则这个测试实际上只能证明您的测试能够执行回滚。您应该调用负责处理事务的方法,确保它失败,然后断言数据库中没有更新任何内容。