Откат ORMapper Queries - PullRequest
       15

Откат ORMapper Queries

1 голос
/ 20 декабря 2011

Мы используем MyBatis (3.0.5) в качестве инструмента or-mapping (и я не имею права говорить об этом!).

Я создал объект Responseчто через MyBatis отображается на нашу таблицу базы данных [responses] (мы используем PostgreSQL).

На самом деле используемая нами структура отображения выглядит следующим образом:

  • ResponseMapper.xml - это файл XML, в котором запросы PSQL определены и сопоставлены с классом ResponseMapper.java ** и его методами
  • ReponseMapper.java - интерфейс, используемый MyBatisдля выполнения запросов, определенных в файле XML (см. выше)
  • ResponseDAO.java - интерфейс, используемый для целей DI (мы используем Spring)
  • ResponseDAOImpl.java - конкретная реализация ResponseDAO, которая фактически вызывает ResponseMapper методы;мы используем Spring для внедрения экземпляров этого класса в наше приложение

Итак, чтобы вставить новую запись [responses] в PostgreSQL, код выглядит так из вызывающего компонента:

@Autowired
private ResponseDAO response;

public void doStuff()
{
    int action = getAction();

    response.setAction(action);

    response.insert();
}

Эта установка прекрасно работает для нас.Однако сейчас я пытаюсь написать набор тестов JUnit для класса ResponseDAOImpl и хочу убедиться, что он правильно выполняет запросы к нашей базе данных PostgreSQL.

Насколько я могу судить,нет способа "издеваться" над всей базой данных.Так что мой единственный вариант (на первый взгляд) - это чтобы тестовые методы выполнили запрос, проверили его успешность и затем откатили его независимо.

MyBatis, похоже, не поддерживает такую ​​функцию отката.Я нашел эту запись из списка рассылки mybatis-user на Old Nabble, но постер использовал Guice, и его / ее вопрос, казалось, был больше о возврате транзакций через Guice.

ЕслиMyBatis не не поддерживает транзакции / откаты ( делает это?!?! ), тогда, похоже, мое единственное повторное получение будет, если драйвер PostgreSQL-JDBC поддерживает их.Я думаю, я мог бы тогда попытаться настроить мои методы тестирования так, чтобы они запускали метод ResponseDAO.insert(), а затем вручную попытаться откатить транзакцию напрямую через драйвер (sans MyBatis).

Имеет ли SOлюбой опыт с этим? образцы кода?Подсказки?Лучшие практики?Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 21 декабря 2011

MyBatis допускает откат при работе с «SqlSession», дело в том, что вы используете элемент вставки зависимостей пружины, который автоматически фиксирует вашу транзакцию после завершения метода.

У вас есть несколько вариантов, среди них

  1. Вставить макет ваших зависимостей. Для этого есть несколько качающихся библиотек. Например, Mockito , , вот хороший вопрос о материалах Spring Mockito . Это проверит вашу бизнес-логику в Java, но не фактические запросы.

  2. Зафиксируйте ваши запросы и удалите ваши данные после запуска теста. Этот подход мы выбрали, потому что он также проверяет нашу базу данных. Очевидно, вам понадобится тестовый экземпляр вашей базы данных, которого нет у некоторых людей.

  3. Вы можете попытаться предоставить собственные привязки теста для классов, которые выполняют автоматическую фиксацию в MyBatis Spring Integration и переопределяют там поведение, чтобы в тестовой среде поведение выполнялось для отката запроса вместо фиксации. Аналогичный подход был использован в интеграции Guice, и он описан здесь .

0 голосов
/ 21 декабря 2011

Не уверен, что это то, что вам нужно, но org.apache.ibatis.session.SqlSession имеет метод rollback (), который можно использовать для отката.

Другой подход заключается в использовании метода getConnection () из того же класса, который будет возвращать класс javax.sql.Connection javax.sql.Connection , который также имеет методы commit () и rollback ()..

Надеюсь, это поможет.Ремис Б

...