@Rollback(false)不使用SpringJUnit4ClassRunner处理@Before

时间:2012-01-13 13:30:17

标签: spring testing junit junit4 spring-test

在我的Spring应用程序的JUnit测试中,我想在设置方法中插入大量数据,然后使用它进行测试。但是,即使我使用@Before

注释方法,在@Rollback(false)方法中执行的任何操作似乎都会在每次测试后回滚。

这是我尝试做的简化版本:

public class TestClass
{
   @Autowired 
   MyService service;

   @Before
   public void setup()
   {
      if(service.getById(1) == null)
      {
         Thing thing = new Thing();
         thing.setId(1);
         service.create(new Thing(1))
      }
   }
}

我也尝试使用@BeforeClass,但这要求方法是静态的,并在调用任何@Autowired setter方法之前执行,因此我无法访问我需要在@BeforeClass运行时调用的服务。

我尝试使用@PostConstruct,但是有一个事务可用的问题(我的设置是这样的,Hibernate会话仅在事务开始时可用)。奇怪的是,会话似乎可用,但是在同一会话中获得的两个对象不相等,这意味着Hibernate一级缓存似乎失败,或者每个操作都在一个单独的会话中发生。 @BeforeTransaction似乎表现出相同的行为。

1 个答案:

答案 0 :(得分:2)

Spring TransactionalTestExecutionListener负责管理Junit测试的事务。它使用两种方法( beforeTestMethod afterTestMethod )来开始和结束每个Junit测试的事务。

对于@Before注释,它似乎是这样工作的,它将Test方法上指定的 @Rollback属性应用于带有@Before注释的to setUp方法

我有这个例子来解释这个过程,我有两个测试方法一个(回滚假,另一个回滚为真)

      @RunWith(SpringJUnit4ClassRunner.class)
      @ContextConfiguration(loader=AnnotationConfigContextLoader.class, classes={SpringConfig.class})
      @Transactional
       public class MyTest 
      {

        @Before
        public void setUp()
        {
            //When executing this method setUp
            //The transaction will be rolled back after rollBackTrue Test
            //The transaction will not be rolled back after rollBackFalse Test
         }


        @Test
        @Rollback(true)
        public void rollBackTrue()
        {
            Assert.assertTrue(true);
        }

        @Test
        @Rollback(false)
        public void rollBackFalse()
        {
            Assert.assertTrue(true);
        }
    }