Модульное тестирование Hibernate POJO - PullRequest
0 голосов
/ 11 марта 2011

У меня есть спящий POJO, который я хочу пройти модульное тестирование. Это выглядит примерно так:

public class MyPojo{
    private final Integer someIntData;

    private MyPojo(){
        //Just to satisfy compiler, hibernate will override
        someIntData = null;
    }

   //Methods etc...
}

Я бы хотел провести модульное тестирование этого класса, но на самом деле не хочу создавать новый конструктор, просто чтобы установить 'someIntData' вручную. Существует ли быстрый и простой способ перехода в спящий режим для создания экземпляра тестового экземпляра MyPojo без использования фиктивной базы данных?

Ответы [ 3 ]

1 голос
/ 11 марта 2011

Если это реальный модульный тест, вам не нужно зависеть от Hibernate.

Обычно можно изменить видимость методов или даже ввести некоторые для того, чтобы иметь возможность модульного тестирования класса.Я не против иметь публичный конструктор с целым числом в качестве аргумента для модульного тестирования POJO.

Вам наверняка понадобится установить идентификатор в ваших POJO, когда вы все равно будете тестировать сервисы.Например, если вы хотите проверить, что myService(MyPOJO p) вызывает myDAO.findFoos(p.getId()), вам потребуется идентификатор в вашем POJO.

1 голос
/ 11 марта 2011

Приватный конструктор означает, что вы предоставляете метод "строитель" для замены конструктора (обычно для неизменяемых экземпляров) или что класс никогда не должен быть инициализирован вообще.В последнем случае это обычно потому, что класс должен быть одноэлементным, и вы предоставляете метод, который возвращает единственный экземпляр.

Hibernate не жалуется на это, поскольку использует отражение для использования этого конструктора.Поскольку вы не должны предоставлять специальный код для теста, единственное решение, которое я вижу, - это использовать отражение для создания нового POJO.

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

1 голос
/ 11 марта 2011

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

      Constructor[] cons = MyPojo.class.getDeclaredConstructors();
      // Change the accessible property of the constructor.
      cons[0].setAccessible(true);
      MyPojo secret = (MyPojo)cons[0].newInstance(null);

Код взят из http://dunwood.blogspot.com/2004/05/instantiate-java-class-that-has.html

Я помню, что читал, что есть некоторые фреймворки, которые облегчают использование отражения для юнит-тестов, но я никогда не использовал их.В таких случаях я всегда предпочитаю создавать второй конструктор или защищать пакет конструктора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...