Spring Data JPA & Hibernate with Cucumber

Ссылка на полную версию проекта на 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

Releated Post