
Ссылка на полную версию проекта на GitHub:
Github SpringDataJPA
Каждый автоматизатор, да и разработчик, часто сталкивается с задачей, когда необходимо получить записи из БД. Напишем небольшую реализацию работы, с релляционной базой H2, при помощи Spring Data JPA & Hibernate библиотек. Посмотрим, насколько Spring помогает уменьшить код, при работе с запросами, и запустим несколько сценариев с фреймворком Cucumber, чтобы было понятно, как данный подход можно применить в написании автотестов.
Использовал:
Spring Data JPA | Hibernate | H2 Database | Cucumber | Junit 5 |
Необходимо выполнить:
– Реализовать контроллер для запросов в БД (Spring Data JPA);
– Написать несколько тестов на Cucumber;
– Запуск проекта из консоли;
Создадим maven проект и подключим необходимые зависимости в pom.xml
Подключаем библотеки фрейворка Spring
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-jpa</artifactId> <version>2.1.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> </dependency> |
Библиотека Hibernate в качестве реализации JPA будет использоваться
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>${hibernate.version}</version> </dependency> |
Драйвер для соединения с БД
<dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <version>${h2.version}</version> </dependency> |
Добавлем Lombok для более чистого кода, с реализацией, к примеру, гетеров – сетеров через аннотации.
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> </dependency> |
Для запуска тестов будем использовать фрейворки Cucumber и Junit 5
<dependency> <groupId>io.cucumber</groupId> <artifactId>cucumber-java</artifactId> <version>${cucumber.version}</version> </dependency> <dependency> <groupId>io.cucumber</groupId> <artifactId>cucumber-junit</artifactId> <version>${cucumber.version}</version> </dependency> <dependency> <groupId>io.cucumber</groupId> <artifactId>cucumber-spring</artifactId> <version>${cucumber.version}</version> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>${junit.jupiter.version}</version> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <version>${junit.jupiter.version}</version> </dependency> |
За создание таблиц и наполнение их тестовыми данными будет полностью отвечать Spring. Для этого настроим конфигурационный файл application.properies
spring.datasource.url=jdbc:h2:mem:mydb;DB_CLOSE_DELAY=-1 spring.datasource.driverClassName=org.h2.Driver spring.datasource.username=sa spring.datasource.password=sa spring.jpa.hibernate.ddl-auto=none spring.jpa.show-sql=true em.packages.scan=ru.gotoqa spring.jpa.database-platform=org.hibernate.dialect.H2Dialect spring.datasource.initialization-mode=always spring.datasource.platform=h2 |
Проект настроен, можем переходить к написанию кода.
Теперь необходимо сгенерировать сущности Entity для мапинга каждой таблицы. Аннотацию @Entity используется для сопоставления класса PersonEntity с таблицей Person. Поле id помечено @Id и @GeneratedValue, оно является первичным ключом и его значение генерируется автоматически.
Для таблицы Person
@Entity @Data @Builder @NoArgsConstructor @AllArgsConstructor @Table(name = "Person", schema = "actors") public class PersonEntity { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Integer id; @Column(name = "first_name") private String firstName; @Column(name = "last_name") private String lastName; private Date birthday; private String email; private String phone; private String job; } |
Для таблицы Geography, описание сущности Entity будет дополнено статичным классом primary key (PK) – это значение и будет составлять уникальный ключ Id, который требуется для корректной работы Hibernate.
@Entity @Data @Builder @NoArgsConstructor @AllArgsConstructor @Table(name = "Geography") public class GeographyEntity { @EmbeddedId private PK pk; @Basic private Integer population; @Basic private String language; @Embeddable @Data public static class PK implements Serializable { @Basic @Column(name = "country", insertable = false, updatable = false) private String country; @Basic @Column(name = "city", insertable = false, updatable = false) private String city; } } |
Структура проекта такая:
ru.gotoqa.config – Каталог содержит классы конфигурации Spring, параметры подключения к БД и тд
ru.gotoqa.entity – Каталог для сущностей мапинга к таблицам
ru.gotoqa.repository – Содержит интерфейсы, которые расширяет интерфейс CrudRepository из Spring Data JPA
ru.gotoqa.service – Сервис классы для управления транзакциями, отделяет бизнесс уровень от реализации DAO в репозитории
ru.gotoqa.steps – Определяет реализацию шагов фремворка Cucumber
src/test/java/resources/*.feature – Каталог для написания тестовых сценариев (feature) фремворка Cucumber
Как в учебнике, тесты не видят сервисы и реализацию работы с БД, каждый слой отвечает исключительно за свою работу.
После запуска тестов, получаем отчёт в консоли.
Feature: Сheck records in a db table Scenario: Check records in Person table (should be 5) Then get all: 5 records from Person table Scenario: Check records in Geography table (should be 4) Then get all: 4 records from Geography table |
2 Scenarios (2 passed) 2 Steps (2 passed) 0m0,243s |
Ссылка на полную версию проекта на GitHub:
Github SpringDataJPA