Приложение представляет собой приложение 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
с настроенными путями базовых пакетов. Я пробовал и строковый вариант, и вариант класса, но результат один и тот же.
Что я делаю не так?