Spring boot 2 со встроенным postgres - должна присутствовать хотя бы одна метамодель JPA - PullRequest
0 голосов
/ 09 мая 2018

Приложение представляет собой приложение Spring boot v2, содержащее следующие зависимости:

     <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-tomcat</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.apache.tomcat</groupId>
                <artifactId>tomcat-jdbc</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

    <dependency>
        <groupId>com.zaxxer</groupId>
        <artifactId>HikariCP</artifactId>
        <version>3.1.0</version>
    </dependency>

    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <scope>runtime</scope>
    </dependency>

    <dependency>
        <groupId>com.opentable.components</groupId>
        <artifactId>otj-pg-embedded</artifactId>
        <version>0.12.0</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.assertj</groupId>
        <artifactId>assertj-core</artifactId>
        <version>3.2.0</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>io.projectreactor</groupId>
        <artifactId>reactor-test</artifactId>
        <version>3.1.7.RELEASE</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <scope>test</scope>
    </dependency>

и application.yml содержит конфигурацию для фактического экземпляра postgres, и я создал одну сущность

package org.myorg.project.domain;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.*;

@Entity
@Table(name = "SomeEntity")
@Data
@NoArgsConstructor
public class SomeEntity {

    @Id
    @GeneratedValue
    @Column(name = "id")
    private Long id;

    @Column(name = "someValue")
    private String someValue;
}

и хранилище

package org.myorg.project.repository;

import org.myorg.project.domain.SomeEntity;
import org.springframework.data.jpa.repository.JpaRepository;

public interface SomeEntityRepository extends JpaRepository<SomeEntity, Long> {
}

Запуск приложения и использование репозитория и сущности работает, как и ожидалось. Соединение с базой данных установлено, сущности сохранены, все хорошо.

Тесты ... не так много. Я хочу настроить тесты на использование OpenTable Embedded PostgreSQL Component , чтобы тесты использовали ту же реализацию БД, чтобы избежать головной боли, а также чтобы иметь возможность тестировать хранимые процедуры и вещи, которые БД в памяти обычно не предоставляют. Я написал простой тест с настройкой:

package org.myorg.project.repository;

import com.opentable.db.postgres.junit.EmbeddedPostgresRules;
import com.opentable.db.postgres.junit.SingleInstancePostgresRule;
import org.myorg.project.domain.SomeEntity;
import org.junit.ClassRule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.AnnotationConfigContextLoader;

import javax.sql.DataSource;

@RunWith(SpringJUnit4ClassRunner.class)
//@ContextConfiguration(classes = {SomeEntityRepositoryTest.Config.class})
//@ContextConfiguration(loader = AnnotationConfigContextLoader.class)
@SpringBootTest
public class SomeEntityRepositoryTest {

    @ClassRule
    public static SingleInstancePostgresRule singleInstancePostgresRule = EmbeddedPostgresRules.singleInstance();

    @Autowired
    private SomeEntityRepository someEntityRepository;

    @Test
    public void test() {
        System.out.println(singleInstancePostgresRule);
        System.out.println(singleInstancePostgresRule.getEmbeddedPostgres());

        System.out.println(someEntityRepository);
    }

    @Configuration
    @EntityScan(basePackageClasses = SomeEntity.class)
    @EnableJpaRepositories(basePackageClasses = SomeEntityRepository.class)
    public static class Config {

        @Bean
        public DataSource dataSource() {
            return singleInstancePostgresRule.getEmbeddedPostgres().getPostgresDatabase();
        }
    }
}

Однако после выполнения этого теста я получаю исключение java.lang.IllegalArgumentException: At least one JPA metamodel must be present!.

Как видите, у меня есть аннотации @EnableJpaRepositories и @EntityScan с настроенными путями базовых пакетов. Я пробовал и строковый вариант, и вариант класса, но результат один и тот же.

Что я делаю не так?

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