@Rollback (false) не работает на @ перед использованием SpringJUnit4ClassRunner - PullRequest
5 голосов
/ 13 января 2012

В тесте JUnit в моем приложении Spring я хотел бы вставить много данных в метод установки, а затем использовать их для тестирования.Однако все, что делается в методе @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, поэтому я не могу получить доступ к службам, которые янеобходимо вызвать при выполнении @BeforeClass.

Я пытался использовать @PostConstruct, но есть проблемы с доступностью транзакции (и моя настройка такова, что сеанс Hibernate доступен только при запуске транзакции).Кажется странным, что сеанс был доступен, но два объекта, полученные из одного и того же сеанса, не были равны, что означало, что кэш 1-го уровня в Hibernate, похоже, отказывал или каждая операция выполнялась в отдельном сеансе.@BeforeTransaction казалось, демонстрирует то же поведение.

1 Ответ

2 голосов
/ 14 января 2012

Spring TransactionalTestExecutionListener отвечает за управление транзакцией для тестов Junit. Он использует два метода ( beforeTestMethod и afterTestMethod ) для запуска и завершения транзакции для каждого из тестов Junit.

Что касается аннотации @Before, похоже, она работает следующим образом. Она применяет атрибут @ Rollback, указанный в методе Test, к методу setUp с аннотацией @Before

У меня есть этот пример для объяснения процесса, у меня есть два метода тестирования, один с (откат false, другой с откат true)

      @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);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...