Spring, JPA - интеграционный тест CRUD сущности, который имеет множество переходных зависимостей других сущностей - PullRequest
0 голосов
/ 03 апреля 2012

У меня есть сущность, например Product, который объединяет другие объекты, такие как Category. Эти объекты также могут объединять другие объекты и так далее. Теперь мне нужно проверить свои запросы к базе данных.

Для простого CRUD я бы создал макет EntityManager. Но что, если у меня есть более сложный запрос, который мне нужно проверить на корректную функциональность. Тогда мне, вероятно, нужно сохранить сущность (или их больше) и попытаться получить / обновить что угодно. Мне также нужно сохранить все сущности, от которых зависит мой Product.

Мне не нравится такой подход. Как лучше всего проверить такие запросы?

Спасибо за ответы.


Обновление - пример

Предположим, что следующая структура сущности enter image description here

Эта структура поддерживается реализацией JPA. Например, Product класс будет выглядеть так:

@Entity
public class Product {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String name;

    @ManyToOne
    private Category category; 

    @ManyToOne
    private Entity1 something;    
}

Так что теперь, если я хочу протестировать любой запрос, используемый в DAO, мне нужно создать Product в базе данных, но это зависит от Category и Entity1 и есть аннотация @ManyToOne, поэтому значения не могут быть null. Так что мне тоже нужно сохранять эти сущности, но они также имеют зависимости.

Я рассматриваю возможность предварительного создания объектов, таких как Category, Entity1 и Entity2, перед тестированием с использованием сценария SQL или dbunit (упомянутого в @chalimartines), что позволило бы сохранить большой объем кода, но я не знаю хорошее ли это решение. Я хотел бы узнать некоторые передовые практики для такого тестирования.

Ответы [ 2 ]

1 голос
/ 03 апреля 2012

вы можете использовать @TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true) как

@ContextConfiguration(locations={"classpath:/path/to/your/applicationContextTest.xml"})
@RunWith( SpringJUnit4ClassRunner.class)
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
public class YourClassTest {

    @Test
    public void test() {
        //your crud
    }

}

update

Вы не можете установить зависимости равными нулю, чтобы избежать их сохранения

1 голос
/ 03 апреля 2012

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

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