Я пытаюсь выполнить сценарий SQL в моем тесте JUnit, используя Spring.Сценарий используется для настройки данных для тестов.Однако при запуске сценария вставки в сценарии фиксируются после каждого теста.В документации Spring написано, что не стоит ожидать отката с DDL, но все, что написано в моем скрипте - это DML.В нем содержатся только операторы INSERT и получение последнего идентификатора вставки (SET @blah = LAST_INSERT_ID ()).
Я что-то не так настраиваю?Я использую это против базы данных MySQL.Наша конфигурация следующая:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "/applicationContext.xml" })
@TransactionConfiguration(defaultRollback = true)
public class OrderTestCase extends AbstractTransactionalJUnit4SpringContextTests {
@Before
public void runSql() {
String fileName = StringUtils.replace(getClass().getName(), ".", "/") + ".sql";
Resource resource = applicationContext.getResource(fileName);
if (resource.exists()) {
executeSqlScript(fileName, false);
} else {
LOGGER.debug("Resource doesn't exist: {}", resource);
}
}
@Test
public void testLoadOrders() {
Collection<Order> orders= dao.findAll();
assertTrue(orders.size() == 3);
}
}
Вот что, я думаю, происходит на основе некоторых исследований.Первый вызов executeSqlScript выполняется в отдельной транзакции.Метод SpringJ SimpleJdbcTemplate.update вызывается executeSqlScript.Поскольку это относится к JDBC-соединению, полученному из пула соединений, я не гарантирую получить такое же соединение при последующем доступе к БД и, следовательно, не могу гарантировать выполнение в той же транзакции.
Если бы я выполнял все свои операции с БД через TransactionManager или (Hibernate Session Factory), то это работало бы из-за того, как внутренние компоненты охватывают транзакции.Мои варианты здесь:
Узнайте, как запустить SimpleJdbcTemplate.update и последующий фактический код, который я тестирую в той же транзакции.Я думаю, что, возможно, смогу сделать это, но мои усилия до сих пор были бесплодными.
Все мои тестовые данные настроены через SessionFactory.Таким образом, вместо выполнения простых сценариев SQL через JDBC, я бы заполнил объекты модели и сохранил их в Hibernate DAO.
Я на правильном пути?Кто-нибудь может дать еще какие-нибудь рекомендации?