Как выполнить модульное тестирование EJB при использовании JPA2?

StackOverflow https://stackoverflow.com/questions/3834307

Вопрос

Как бы вы провели модульное тестирование EJB, использующего JPA?Например, если у меня есть сущность Order и OrderEJB, который должен вычислять общую сумму заказа (как определено ниже), как мне провести модульное тестирование EJB, не затрагивая базу данных?Кроме того, как бы вы определили значения для своих сущностей, чтобы можно было подтвердить ожидаемый расчет?Вот пример кода ниже...

@Entity
public class Order {
    @Id
    private long OrderId;
    private LineItem[] items;
}

И заказEJB

@Stateless
public class OrderEJB {
    EntityManager em;
    public double calculateOrderTotal(long orderId) { .. }
}

Как бы вы приступили к модульному тестированию метода CalculOrderTotal, если я не могу подключиться к базе данных?Я не хочу внедрять DAO, потому что пытаюсь отойти от этого подхода.

Спасибо за любую помощь.

Это было полезно?

Решение

Разве общая теория не заключается в том, что OrderEJB, Order и LineItem (если игнорировать аннотацию) являются просто POJO и, следовательно, могут быть протестированы в автономном JUnit?Нам нужно будет издеваться над EntityManager, и предположительно в

 calculateOrderTotal()

у вас есть код, который теоретически работает

 em.giveMeThisOrder(orderId)

а ты просто издеваешься над этим.Бизнес-логика, которую вы тестируете, затем зависит от того, что возвращает Mock.Ключом к этому является то, что вы должны использовать хорошую среду для макетирования, например JMock.В любом тесте вы говорите (очевидно, не с таким синтаксисом):

 EntitiyManager mockEm = // create the mock
 mockEm.check(that you are called with and order Id of 73)
 mockEm.please( when someone calls giveMeThisOrder return then **this** particular order)

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

Ключевая идея здесь заключается в том, что модульный тест не предполагает никакой внешней зависимости, такой как база данных.Интеграционное тестирование может использовать реальную базу данных.Сделать правильные макеты может оказаться непростой задачей, создание экземпляров Order может быть довольно скучным занятием, но это, как правило, значительно ускоряет будущее тестирование.

Я также предпочитаю проводить раннее интеграционное тестирование — таким образом вы обнаруживаете совершенно другой класс ошибок.

Другие советы

Вы дали Openejb попробую? - Если вы настроите в встроенном режиме, вы можете в значительной степени запустить модульные тесты от Eclipse. Я издевал инъекции менеджера сущности и т. Д. Для тестирования подразделения раньше, но тогда он становится утомительным. С OpeneJB вы можете сделать это с меньшим настройкой. http://openejb.apache.org/

Вот что я делаю:

Сначала вам необходимо настроить базу данных в памяти для ваших тестов. Он работает так же, как обычная база данных, но она не хранится на диске. Как Derby и HSQLDB поддерживают это.

В вашем модульном тесте создайте EntityManager вручную и введите его в свой экземпляр EJB. Вам, вероятно, нужно будет хранить ссылку на EntityManager, чтобы вы могли управлять транзакциями, как это:

em.getTransaction().begin();
myEjb.doSomething(x, y);
em.getTransaction().commit();
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top