2016-07-20 4 views
1

У меня есть сущность, которая сопоставляется с представлением SQL. У меня также есть настроенный для него репозиторий java-данных весны. Когда приложение работает, все работает нормально. Однако проблема начинается, когда я пытаюсь запустить мои тесты, в которых используется база данных H2 в памяти. Я подозреваю, что причина этого в том, что представление отсутствует, когда начинается H2, и, вероятно, рассматривается как независимый объект, и, следовательно, Spring boot настраивает его как независимую таблицу в памяти.Как инициализировать представление во H2

Конфигурация базы данных H2 как ниже -

@Bean 
public DataSource dataSource() { 
    return new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2).build(); 
} 

Я пытался поставить определение представления в файле schema.sql в папке тест ресурсов -

CREATE VIEW 
    my_view 
AS 
    SELECT 
     column_1, 
     column_2 
    FROM 
     m 
    INNER JOIN 
     mu 
    ON 
     m.id = mu.m_id 
    INNER JOIN 
     u 
    ON 
     mu.id = u.mu_id 

Однако, это не поможет или. Таким образом, всякий раз, когда я называю настроенное хранилище JPA в моих тестах -

public interface MyViewRepository extends JpaRepository<MyView, Long> {} 

как это -

myViewRepository.findAll() 

возвращает пустой список, даже если я создаю все m, mu и u объекты в моих тестах используя соответствующие репозитории перед этим поиском.

Как настроить H2 так, чтобы он определял мое определение?

ответ

1

Я предполагаю, что вы объявляете другой источник данных для интеграции или производственной среды, подключаясь к базе данных, которая уже создана и имеет объявленное ожидаемое представление.

При запуске тестов и объявлении @Bean вы, вероятно, должны указать, что именно вы хотите выполнить, чтобы приложение было запущено до запуска приложения. Spring Boot создает пустой H2 db.

Попробуйте это:

Предполагая, что ваш schema.sql в src/test/resources

@Bean 
public DataSource dataSource() { 
    return new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2) 
             .addScript("schema.sql")           
             .build(); 
} 

Позаботьтесь, что ваша точка зрения является Отсносящимися столами m и mu, которые должны быть объявлены также в том же сценариях или другой вы хотите (вы может объединить столько вызовов addScript, сколько вам нужно/нужно).

Возможно, ваш подход к созданию сущностей посредством создания новых объектов с помощью Repository тоже верен, но я никогда не пробовал этого, и то, как я предлагаю вам работать точно.

В любом случае, вы также можете проверить, что является содержимым встроенной базы данных H2 во время выполнения тестов с помощью h2-console.

С весны документации на 29,4 (http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-sql.html):

следующее должно быть истинным:

  • Вы разработки веб-приложений
  • ком.h2database: h2 находится на пути к классам
  • Вы используете средства разработки Spring ботинка

Если вы не используете средства разработки Spring ботинка, вы также можете сделать это:

Добавить spring.h2.console.enabled = true в application.properties файл

Тогда вы должны иметь возможность использовать веб-консоль H2 по пути по умолчанию http://domain:port/contextPath/h2-console и проверять содержимое в каждый момент.

Надеюсь, что это поможет :)

+0

Ну, я хотел более чистого решения, чем это. Было бы здорово, если бы каким-то образом я мог заставить H2 распознать мое сопоставление просмотров, но кажется, что отображение объекта для просмотра не работает :(... ну, я думаю, преимущество этого представления перевешивает этот простой недостаток. Спасибо за ваш ответ! –

Смежные вопросы