【问题标题】:@Rollback(false) not working on @Before using SpringJUnit4ClassRunner@Rollback(false) 在使用 SpringJUnit4ClassRunner 之前不适用于 @Before
【发布时间】:2012-02-09 16:50:47
【问题描述】:

在我的 Spring 应用程序的 JUnit 测试中,我想在 setup 方法中插入大量数据,然后使用它进行测试。但是,@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 方法之前执行,所以我无法访问我需要在@ 时调用的服务987654326@ 运行。

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

【问题讨论】:

  • 您将@Rollback 注释放在哪里,在类或方法级别?
  • @Ralph 我在setup() 方法@Rollback(false) 上都试过了,然后在课堂上也试过了,同时还用@Rollback 注释了测试方法。
  • 您有没有找到实现这一目标的方法?
  • @Arjan:我不这么认为——我换了一个新雇主,所以不必再处理同样的问题了。

标签: spring testing junit junit4 spring-test


【解决方案1】:

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

至于@Before 注释,它似乎是这样工作的,它将Test 方法上指定的@Rollback 属性应用于带有@Before 注释的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);
        }
    }

【讨论】:

  • 嗨,Prasana。感谢您的回答,但这不可能是正确的。如果 service.create() 不是事务的一部分,那么为什么在每次测试后默认回滚呢?问题是希望它位于事务之外,因此它不会被回滚,但不知道如何回滚。
  • 对不起,我的测试让我失望了,我也应该阅读方法文档,我用一个例子改变了答案。
猜你喜欢
  • 1970-01-01
  • 2016-10-05
  • 2018-05-11
  • 2023-03-03
  • 2011-08-16
  • 2011-07-24
  • 1970-01-01
  • 1970-01-01
  • 2020-05-21
相关资源
最近更新 更多