Я создаю флягу, используя mvn clean install. Сбой на @Test void contextLoads (). Если я это прокомментирую, то смогу создать jar с указателем db url на мой> docker контейнер
В рамках модульных тестов, выполненных на этапе test
в maven, mysqlindocker
имя хоста не может быть разрешено:
jdbc:mysql://mysqlindocker:3306/<dbname>
Это разрешат только контейнеры в одной сети docker.
И так как эти тесты выполняются вне контейнера (прежде чем начать его, чтобы быть точным ), они не могут получить доступ к этой сети.
Как это решить?
1) Устранение root причины
Фактически, root причина вашей ошибки сборки во время выполнения модульного теста заключается в том, что вы не определили jdb c url в соответствии с целевой областью действия.
Действительно, на этапе test
сборки maven обычно требуется, чтобы тесты использовали базу данных в памяти или указанную базу данных c MySQL. Вы не хотите использовать тот же, который использовался для основного приложения по согласованным причинам (проверка воспроизводимости). В данном случае рекомендуется использовать другой экземпляр базы данных для модульного тестирования, и эта база данных должна быть доступна с хоста, на котором выполняется сборка (localhost
).
Вы можете переопределить свойство spring.datasource.url
для выполненных тестов: либо определив application-test.properties/yml
файл в src/test/resources
или переопределение свойства непосредственно в тестовом классе @SpringBootTest(properties=...)
.
2) Обходной путь
Обратите внимание, что если порт контейнера MySQL дБ публикуется на хосте, на котором выполняется сборка, (временным) обходным решением будет сохранение localhost в определенном URL в spring.datasource.url
для сборки и переопределить его именем контейнера docker во время выполнения, когда вы запускаете JAR в качестве конечной точки контейнера:
java -jar myApp.jar --spring.config.location=jdbc:mysql://mysqlindocker:3306/dbname