Проблема с запуском модульного теста в DataJPATest - PullRequest
0 голосов
/ 08 мая 2020

Это моя первая попытка написать тестовый модуль загрузки Spring с использованием базы данных H2 в памяти. Найденные мной руководства делают его простым, но я не могу заставить его работать.

H2 генерирует длинную последовательность синтаксических ошибок, я верю в попытку выполнить весь DDL, необходимый для сущностей.

Мой класс модульного теста:

    @RunWith(SpringRunner.class)
    @DataJpaTest()
    public class AppRepositoryTest
    {

        @Autowired
        private TestEntityManager entityManager;

        @Autowired
        private OrganizationRepository organizationRepository;

        @Test
        public void test_findAppsForUserAndTeam()
        {
            // given
            Organization organization = new Organization();
            organization.setOrganizationCode("o");
            organization.setOrganizationName("O");
            entityManager.persist(organization);
            entityManager.flush();

            // when
            Organization found = organizationRepository.getOrganizationWithParents("o")
                    .orElseThrow(() -> new RuntimeException("Org not found"));

            // then
            assertThat(found.getOrganizationName(), is("O"));
        }
    }

Первое, что мне нужно было сделать, это создать схему, что я и сделал, добавив эту строку в resources / schema. sql:

CREATE SCHEMA  IF NOT EXISTS EUAMDB;

Выполнение теста приводит к ошибке и длинной строке синтаксических ошибок, например:

org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "drop table euamdb.public.access_requests if exists" via JDBC Statement
    at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:67) ~[hibernate-core-5.4.12.Final.jar:5.4.12.Final]
        ...
Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "DROP TABLE EUAMDB.PUBLIC.[*]ACCESS_REQUESTS IF EXISTS"; SQL statement:
drop table euamdb.public.access_requests if exists [42000-200]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:453) ~[h2-1.4.200.jar:1.4.200]

Благодарю за любую помощь.

Обновление:

Я понимаю, что мне нужно заставить Spring использовать euamdb в качестве имени базы данных (спасибо @Evgenij). В настоящее время он генерирует случайное имя базы данных, как я вижу в журнале, например:

Starting embedded database: url='jdbc:h2:mem:9929f516-5795-477c-8a8a-343b4b30ebf9;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false', username='sa'

Если я остановлю код в отладчике до того, как он создаст источник данных, и заменю случайное имя базы данных на «euamdb», затем запускается тест. Я просто не могу понять, как указать Spring, что использовать в качестве имени базы данных H2.

Я попытался изменить аннотацию @DataJpaTest, чтобы установить свойство как:

@DataJpaTest(properties = {"spring.datasource.url=jdbc:h2:mem:euamdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false"})

а также попытался добавить эту аннотацию:

@TestPropertySource(properties = {
        "spring.datasource.url=jdbc:h2:mem:euamdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false"})

и, наконец, изменил spring.datasource.url в application.yml, но ни одна из этих вещей не изменила способ установки имени базы данных при выполнении.

Ответы [ 2 ]

0 голосов
/ 08 мая 2020
• 1000 Итак, когда они были удалены во всех объектах, тест можно запустить. Я тоже не вижу никакого влияния на приложение.
0 голосов
/ 08 мая 2020

В таких командах, как DROP TABLE EUAMDB.PUBLIC.ACCESS_REQUESTS, часть EUAMDB - это имя каталога (в H2 это имя базы данных), PUBLIC часть - имя схемы (PUBLIC - по умолчанию схема в H2, а не только в H2), а ACCESS_REQUESTS - имя таблицы. Таким образом, вам не нужна схема EUAMDB, но вместо этого вам нужно переименовать свою базу данных в EUAMDB. Например, такое имя будет использоваться с URL-адресами jdbc:h2:mem:euamdb или jdbc:h2:./euamdb.

...