junit 4 TransactionalTestExecutionListener вставить тестовые данные только один раз для всех тестов в классе? - PullRequest
4 голосов
/ 09 октября 2010

У меня есть тестовый класс junit 4, тестирующий DAO.

модульный тест:

  @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations = {
      "classpath:/WEB-INF/applicationContext-db.xml",
      "classpath:/WEB-INF/applicationContext-hibernate.xml",
      "classpath:/WEB-INF/applicationContext.xml" })
    @TestExecutionListeners({DependencyInjectionTestExecutionListener.class, TransactionalTestExecutionListener.class})
    @DataSetLocation("test/java/com/yada/yada/dao/dbunit-general.xml")
    @TransactionConfiguration(transactionManager="transactionManager", defaultRollback = true)
    @Transactional
    public class RealmDAOJU4Test {

     @Autowired
     private DbUnitInitializer dbUnitInitializer;

     @Autowired
     private RealmDAO realmDAO;

     @BeforeTransaction
     public void setupDatabase() {
       // use dbUnitInitializer to insert test data
     }

     @Test
     public void testGetById() {
      Integer id = 2204;
      Realm realm = realmDAO.get(id);
      assertEquals(realm.getName().compareToIgnoreCase(
        "South Technical Realm"), 0);
      assertEquals(8, realm.getRealmRelationships().size());
     }

     // more test methods annotated here
}

Метод @BeforeTransacation выполняется перед КАЖДЫМ методом тестирования. Я хотел бы сделать следующее: использовать мой DbUnitInitializer для загрузки данных в мою базу данных - ОДИН РАЗ, когда класс создан. Затем пусть каждый тест в классе делает то, что ему нужно, с базой данных, а затем откатывает (не фиксирует) свои изменения. Кажется, слишком много, чтобы заново вставить все те же данные из моих тестовых файлов перед КАЖДЫМ тестом. Есть ли способ сделать это?

или

Является ли правильный способ написания этих тестов для полной загрузки базы данных перед КАЖДЫМ тестом? Если да, то какая функция defaultRollback = true имеет в этой ситуации?

спасибо за помощь в моих мыслях ...

1 Ответ

2 голосов
/ 30 декабря 2011

Вам необходимо использовать TestExecutionListener и настроить базу данных в методе beforeTestClass.См. Раздел « Аннотации» главы «Тестирование» в руководстве пользователя Spring.

...