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

2022-09-01 04:40:46

我在测试我的DAO和服务时没有问题,但是当我测试s或s时,我想回滚事务而不影响我的数据库。INSERTUPDATE

我正在使用我的服务来管理事务。我想知道,是否有可能知道一个事务是否会很好,但是回滚它以防止更改数据库?@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();
    }
}

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


答案 1

您需要将事务边界扩展到测试方法的边界。您可以通过将测试方法(或整个测试类)注释为:@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 ... ); 
} 

答案 2

退房

http://static.springsource.org/spring/docs/2.5.x/reference/testing.html

第8.3.4节,特别是

Spring有一些用于测试的类,这些类将每个测试包装在一个事务中,因此数据库不会更改。如果您愿意,也可以更改该功能。

编辑 -- 根据你的详细信息,你可能想要查看

摘要TransactionalJUnit38SpringContextTests at

http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/test/context/junit38/AbstractTransactionalJUnit38SpringContextTests.html


推荐