2011-12-20 5 views
1

Мы используем MyBatis (3.0.5) в качестве нашего инструмента для сопоставления (или у меня нет никаких прав для этого!).Откат Запросы ORMapper

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

На самом деле, структура ormapping мы используем следующим образом:

  • ResponseMapper.xml - это файл XML, где PSQL запросы определены и сопоставлены с ResponseMapper.java ** класса и его методы
  • ReponseMapper.java - интерфейс, используемый MyBatis для выполнения запросов, определенных в файле XML (выше)
  • ResponseDAO.java - интерфейс, используемый для DI (используется пружина)
  • 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, похоже, не поддерживает эту функцию отката. Я нашел this опубликовать список рассылки mybatis-user на Old Nabble, но плакат использовал Guice, и его вопрос, похоже, был больше связан с откатом транзакций через Guice.

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

Есть ли у этого опыт? Образцы кода? Советы? Лучшие практики? Заранее спасибо!

ответ

0

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

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

  1. Подайте Mock ваших зависимостей. Для этого есть несколько качающихся библиотек. Мне нравится Mockito, here is a good question on Spring Mockito stuff. Это проверит вашу бизнес-логику в вашей Java, но не ваши актуальные запросы.

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

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

+0

Энди, не могли бы вы посмотреть на ответ Ремиза Б и мой комментарий? Не будет ли это решение работать? Что, если мой тестовый метод впервые получил SqlSession из SqlSessionFactoryBean и setAutoCommit (false), получил Savepoint, выполнил запрос и затем выполнил возврат к Savepoint? Весна все еще отменяет это поведение?!? – IAmYourFaja

+0

Вы вводите карты? Если так, я думаю, Spring все равно откроет новый SqlSession для вызовов картографа. Я действительно больше знаком с материалами Guice, но документы [1] заставляют меня думать, что mapper запускает собственный сеанс sql. http://code.google.com/p/mybatis/downloads/detail?name=mybatis-spring-1.0.2-reference.pdf – Andy

0

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

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

Надеюсь, это поможет. Remis B

+0

Вы знаете, что я даже об этом не думал. Я могу получить доступ к SqlSessionFactory через мой контекст приложения (поставляется Spring). Оттуда я могу получить SqlSession и Connection, которые, как вы указали, дают мне доступ к Savepoints, commit() и rollback(). Спасибо, Ремис! – IAmYourFaja

+0

Добро пожаловать. Это должно сработать. –