Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Создание DataSource для тестирования


Автор: Alexis 20.11.2007, 22:04
Имеются DAO-классы к которым нужно написать тесты. Проблема в том, что используется соединение через DataSource, который поднимает Tomcat. Т. е. что-то вроде:
Код

// суперкласс класс для всех DAO-классов
public class BaseDAO {
  //...
  public Object executeQuery(String sql, /* ... */)  {
    Context initContext = new InitialContext();
    Context envContext  = (Context)initContext.lookup("java:/comp/env");
    DataSource ds = (DataSource)envContext.lookup("jdbc/MyDS");
    conn = ds.getConnection();
    // ...
  }
}

Все запросы в конечном счете обрабатываются методом executeQuery. Есть задумка сделать базовый класс для всех тест-кейсов DAO и если бы в setUp() получилось бы создать свою DataSource, то все бы получилось отлично оттестировать. Можно ли как-нибудь быстро и просто создать свою DataSource?

Автор: powerOn 20.11.2007, 22:58
Это вам нужно "мокировать" объекты.  Посмотрите вот тут: http://www.jmock.org/. Там есть и get started и рецепты по использованию.

Автор: Alexis 20.11.2007, 23:16
Цитата(powerOn @  20.11.2007,  23:58 Найти цитируемый пост)
Это вам нужно "мокировать" объекты.  Посмотрите вот тут: http://www.jmock.org/. Там есть и get started и рецепты по использованию. 

Спасибо за ссылку, уже скачиваю, буду разбираться.

Автор: Alexis 21.11.2007, 01:50
powerOn, 
Я так понимаю, идея в том, чтобы вынести получение DataSource в отдельный метод, написать интерфейс, а потом на тестах переопределить с помощью mocked объектов вызов метода getDataSource, чтобы он возвращал, к примеру, DataSource с одним подключением, который я ему и создаю. Т. е. подсовывать свой DataSource с помощью mocked. Как-то навороченно получается, ну да ладно попробую реализовать, если слегка подправить тестируемый код, то можно сделать даже вполне красиво.

Автор: powerOn 21.11.2007, 02:07
Да, похоже на то.

Распишу немного подробнее:
Мокирование объекта - это создание заглушки для этого объекта во время выполнения программы. Это очень полезная функция для тестирования. Ты можешь "замокать" любой абстрактный (или конкретный) класс или интерфейс и определить свое поведение методов. 

Например используешь ты Java Server Faces, написал Managed-Bean, который активно использует методы FacesContext. Задача его протестировать. Но так как FacesContext создаётся и инициализируется JSF-ом во время выполнения на сервере, то создать такой объект для теста нет возможности. Для решение такой задачи как раз подходит мокирование. Ты можешь создать объект FacesContext и переопределить поведение метода как тебе угодно (т.е. что бы покрытие было 100%).
Кстати, важно иметь set методы для мокируемого объекта в тестируемом классе, что бы иметь возможность подсунуть заглушку.

Автор: Alexis 21.11.2007, 12:00
powerOn, спасибо, я примерно так и понял. Интересная штука, раньше о ней не слышал.

Автор: powerOn 21.11.2007, 12:58
Пожалуйста. Если твой вопрос решён, не забывай помечать его таковым.  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)