当前位置: 首页 > 面试题库 >

在JUnit中使用Spring测试服务时如何回滚数据库事务?

萧麒
2023-03-14
问题内容

我测试我的DAO和服务没有问题,但是当我测试INSERTs或UPDATEs时,我想回滚事务并且不影响我的数据库。

我正在使用@Transactional我的服务来管理交易。我想知道,是否有可能知道交易是否正常,但是回滚它以防止更改数据库?

这是我的测试:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:/META-INF/spring.cfg.xml")
@TransactionConfiguration(defaultRollback=true)
public class MyServiceTest extends AbstractJUnit38SpringContextTests  {
    @Autowired
    private MyService myService;

    @BeforeClass
    public static void setUpClass() throws Exception {
    }

    @AfterClass
    public static void tearDownClass() throws Exception {
    }

    @Test
    public void testInsert(){
        long id = myService.addPerson( "JUNIT" );
        assertNotNull( id );
        if( id < 1 ){
            fail();
        }
    }
}

问题在于该测试将失败,因为事务已回滚,但是插入正常!如果删除,@TransactionConfiguration(defaultRollback=true)则测试通过,但新记录将插入数据库。

@Test
@Transactional
@Rollback(true)
public void testInsert(){
    long id = myService.addPerson( "JUNIT" );
assertNotNull(id);
if( id < 1 ){
        fail();
    }
}

现在可以正确测试通过,但是回滚将被忽略,并且记录将插入到数据库中。显然,我已经addPerson()在myService中注释了该方法@Transactional。为什么回滚被忽略?


问题答案:

您需要将事务范围扩展到测试方法的范围。您可以通过将测试方法(或整个测试类)注释为@Transactional

@Test 
@Transactional
public void testInsert(){ 
    long id=myService.addPerson("JUNIT"); 
    assertNotNull(id); 
    if(id<1){ 
        fail(); 
    } 
}

您还可以使用这种方法来确保在回滚之前正确写入了数据:

@Autowired SessionFactory sf;

@Test 
@Transactional
public void testInsert(){ 
    myService.addPerson("JUNIT"); 
    sf.getCurrentSession().flush();
    sf.getCurrentSession().doWork( ... check database state ... ); 
}


 类似资料:
  • 问题内容: 我正在运行一个简单的JUnit测试,又是一个应用程序DAO。问题是我总是得到: JUnit测试是: 如你所见,我明确声明不回滚此方法。 Spring JUnit支持是否总是将rollback设置为true? 问题答案: 它应该可以正常工作,就像你期望的那样,但是可能是你在被测类中打开了另一个事务,或者某个地方有其他功能/或错误。 顺便说一句,这个注释应该是足够的:

  • 我在使用@Transactional注释进行事务回滚时遇到了一个问题。 我在backingbean、service和dao类中有以下方法:

  • 我试图编写一个spring-cloud-stream函数(spring-starter-parent 2.5.3,java 11,spring-cloud-version 2020.0.3),该函数同时具有Kafka和Postgres事务。每当使用的消息以字符串“fail”开始时,该函数将引发一个模拟错误,我希望这将导致数据库事务回滚,然后导致kafka事务回滚。(我知道Kafka交易不是XA,这

  • 问题内容: 我对各种服务进行了一些集成测试,这些测试扩展了以下基类: 在大多数情况下,这可以正常工作,但是我有一个服务类,该类具有定义的事务。看来这些事务没有回滚(因为它们是嵌套事务,并且显然是在“外部”事务中提交的?)。至少根据测试日志,回滚“外部”(测试用例级别)事务。提交的事务弄乱了一些以后的测试,因为它们已经更改了测试数据。 我可以通过强制测试在测试之间重新创建和重新填充数据库来解决此问题

  • 我正在努力做一个工作junit测试,以回滚在骆驼路由过程中发生的操作。 我有一个骆驼路线设置,可以监听目录。它需要一个csv文件。当csv文件出现时,它会创建新的SearchAnalytics数据。它会在csv文件中的每一行向表中添加新行。 我放的默认的Spring事务方法似乎不适用于骆驼路由上发生的操作。 下面的代码可以工作。但是它会永久保存数据,并且不会回滚插入。这意味着测试只会通过一次,除非