Я настроил интеграционные тесты для проекта весенней загрузки, используя тестовые контейнеры (настраивает экземпляр докера с помощью postgresql). Тесты отлично работают, если репозитории, с которыми я тестирую, не используют собственные запросы. Однако всякий раз, когда репозиторий содержит собственный запрос, я получаю следующую ошибку: ERROR: relation "my_table_here" does not exist
. Как заставить мою тестовую конфигурацию работать так, чтобы разрешать собственные запросы?
Ниже приведены настройки моего теста:
@RunWith(SpringRunner.class)
public class TestPostgresql {
@ClassRule
public static PostgreSQLContainer postgreSQLContainer = PostgresDbContainer.getInstance();
/**
* ************ REPOSITORIES ************
*/
@Autowired
NativeQueryRepository nativeQueryRepository;
@TestConfiguration
@EnableJpaAuditing
@EnableJpaRepositories(
basePackageClasses = {
NativeQueryRepository.class
})
@ComponentScan(
basePackages = {
"com.company.project.package.repository"
}
)
static class PostgresConfiguration {
/**
* ************ DATABASE SETUP ************
*/
@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setUrl(postgreSQLContainer.getJdbcUrl());
dataSource.setUsername(postgreSQLContainer.getUsername());
dataSource.setPassword(postgreSQLContainer.getPassword());
return dataSource;
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
HibernateJpaVendorAdapter vendorAdapter = new JpaVendorAdapter();
vendorAdapter.setDatabase(Database.POSTGRESQL);
vendorAdapter.setGenerateDdl(true);
LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
factory.setJpaVendorAdapter(vendorAdapter);
factory.setPackagesToScan("com.company.project");
factory.setDataSource(dataSource());
return factory;
}
@Bean
public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
JpaTransactionManager txManager = new JpaTransactionManager();
txManager.setEntityManagerFactory(entityManagerFactory);
return txManager;
}
}
}
РЕДАКТИРОВАТЬ: я полагаю, это как-то связано со стратегией именования?
Для большего контекста, вот пример того, как nativeQuery используется в репозитории
@Repository
public interface NativeQueryRepository extends JpaRepository<NativeEvent, Long> {
@Modifying
@Transactional
@Query(value = "UPDATE native_event SET state = :state " +
"WHERE secondary_id = :secondaryId", nativeQuery = true)
void updateState(
@Param("state") String state,
@Param("secondaryId") String secondaryId);
}
Я также пытался обновить testProperties для статического класса внутри TestPostgresql
, добавив аннотацию:
@TestPropertySource(properties = {
"spring.jpa.hibernate.naming-strategy=org.springframework.boot.orm.jpa.SpringNamingStrategy"
})
Однако без изменений получена ошибка.
РЕДАКТИРОВАТЬ: добавить NativeEvent
:
@Entity
@Table(
name = "NativeEvent",
indexes = {
@Index(name = "idx_native_event_secondary_id", columnList = "secondaryId")
}
)
@EntityListeners(AuditingEntityListener.class)
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class NativeEvent implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name="secondaryId", nullable=false)
private String secondaryId;
@Column(name="state")
private String state;
}