Заполнять базу данных только один раз перед методами @Test в весеннем тесте?

У меня та же проблема, что и в этом вопросе:

Как заполнить базу данных только один раз перед @ Методы тестирования весеннего теста?

Но решение для меня неприемлемо, потому что это будет запускать один и тот же сценарий для всех моих тестовых классов. Я хочу запускать разные сценарии для каждого тестового класса только один раз. Единственное решение, которое я нашел до сих пор, это добавить if в метод @Before


person Oscar    schedule 31.03.2014    source источник


Ответы (2)


Если вы не хотите загружать (и кэшировать) разные ApplicationContext для каждого теста (см. ниже), ваш единственный вариант — определить поле static boolean и установить его в методе @Before, который заполняет базу данных, если это первый запуск в тесте. класс. Я полагаю, это то, что вы имели в виду, имея if в методе @Before.

Теперь, если вы хотите, чтобы для каждого тестового класса загружался другой ApplicationContext, вы можете определить уникальный @Configuration класс или файл конфигурации XML, который заполняет базу данных для данного тестового класса. Затем вы можете аннотировать свой тестовый класс, например:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({ "/standard-test-config.xml", "TestClass1-config.xml" })
@DirtiesContext( classMode = ClassMode.AFTER_CLASS )
public class TestClass1 { / * ... */ }

or

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { StandardTestConfig.class, TestClass1.Config.class })
@DirtiesContext( classMode = ClassMode.AFTER_CLASS )
public class TestClass1 { / * ... */ }

Затем вы можете использовать <jdbc:embedded-database ...> или <jdbc:initialize-database ...> в XML или EmbeddedDatabaseBuilder или ResourceDatabasePopulatorDatabasePopulatorUtils) в классе @Configuration.

Конечно, загрузка разных ApplicationContext для каждого тестового класса может сильно замедлить работу набора тестов, особенно если загрузка ApplicationContext занимает много времени. Так что вам нужно принять это во внимание.

С уважением,

Сэм

person Sam Brannen    schedule 01.04.2014

Аннотация @BeforeClass позволяет запустить код инициализации для группы тестов. Это выдержка из javadoc:

Иногда несколько тестов должны совместно использовать дорогостоящие вычислительные настройки (например, вход в базу данных). Хотя это может поставить под угрозу независимость тестов, иногда это необходимая оптимизация. Аннотирование метода public static void без аргументов с помощью @BeforeClass приводит к тому, что он запускается один раз перед любым из тестовых методов в классе. Методы @BeforeClass суперклассов будут выполняться перед текущим классом.

person Angular University    schedule 31.03.2014
comment
@BeforeClass обычно не подходит при использовании Spring TestContext Framework, поскольку у вас не будет доступа к DataSource из ApplicationContext в методе @BeforeClass. - person Sam Brannen; 01.04.2014