@在使用SpringJUnit4ClassRunner之前回滚(false)不在@上工作

@在使用SpringJUnit4ClassRunner之前回滚(false)不在@上工作,spring,testing,junit,junit4,spring-test,Spring,Testing,Junit,Junit4,Spring Test,在我的Spring应用程序中的JUnit测试中,我想在setup方法中插入大量数据,然后使用它来测试。但是,每次测试后,在@Before方法中执行的任何操作似乎都会回滚,即使我用@Rollback(false) 下面是我尝试做的一个简化版本: public class TestClass { @Autowired MyService service; @Before public void setup() { if(service.getById(1

在我的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方法之前执行,因此我无法访问运行
@BeforeClass
时需要调用的服务

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

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

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

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


在类或方法级别,您将
@Rollback
注释放在了哪里?@Ralph我已经在
设置()
方法
@Rollback(false)
,,然后也在课堂上,同时用
@Rollback
注释测试方法。你有没有找到实现这一点的方法?@Arjan:我不这么认为-我换了一个新的雇主,因此不必再处理同样的问题。嗨,普拉萨纳。谢谢你的回答,但那不可能是正确的。如果service.create()不是事务的一部分,那么为什么默认情况下每次测试后都会回滚它?问题是希望它位于事务之外,这样它就不会被回滚,但无法找到如何回滚。对不起,我的测试让我放弃了,而且我应该阅读方法文档,我用一个示例更改了答案。
      @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);
        }
    }