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

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

我正在使用@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中使用Spring测试服务时如何回滚数据库事务? 的全部内容, 来源链接: utcz.com/qa/424698.html

回到顶部