web-dev-qa-db-ja.com

@DataJpaTestのSpring Boot 1.4.1でmode = mysqlを埋め込みH2 DBに追加する方法は?

このスキーマにmysql固有の式が含まれている間にjunitテストを実行するときに、schema.sqlファイルを使用してsqlスキーマを作成すると問題が発生します。 mode=mysqlをH2 URLに追加する必要があります。

たとえば、次のようなものです:jdbc:h2:mem:testd;MODE=MYSQL

ただし、Springブートでは、enum org.springframework.boot.autoconfigure.jdbc.EmbeddedDatabaseConnectionで定義されたURLとそのURLが自動的に使用されます

jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE

これを機能させるための同様のアプローチを試みましたが、springはtest-application.propertiesからspring.datasource.url=jdbc:h2:mem:testdb;MODE=MYSQLを取得しません。 test-application.propertiesの他の設定はすべて正常に読み取られました。

エンティティにjavax.persistenceアノテーションを付けてspring/hibernateにスキーマ(schema.sqlファイルなし)を作成させると、すべて正常に動作します。

モードを追加する簡単な方法はありますか?

14
Marco

私はこれと同じ問題を抱えていました。テストの実行時にURLを取得しませんでした。フライウェイを使用してスクリプトを管理しています。これらのいくつかの手順に従うことで、これらすべてを連携させることができました。

Src/test/resources/db/migrationに_V1_init.sql_スクリプトを作成して、flywayによって実行される最初のスクリプトになるようにしました。

_SET MODE MYSQL; /* another h2 way to set mode */

CREATE SCHEMA IF NOT EXISTS "public"; /* required due to issue with flyway --> https://stackoverflow.com/a/19115417/1224584*/
_

スキーマ名publicを含めるために_application-test.yaml_を更新しました:

_flyway:
  schemas: public
_

テストでプロファイルが指定されていることを確認します:@ActiveProfiles("test")

13
anztenney

セットする

spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;MODE=MYSQL

application-test.propertiesに加えて、

@RunWith(SpringRunner.class)
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@ActiveProfiles("test")

テストクラスで

7
Evgeny Batalov

私はこれを機能させるために同様のアプローチを試みましたが、springはtest-application.propertiesからspring.datasource.url = jdbc:h2:mem:testdb; MODE = MYSQLを取得しません

既存のパラメーターを書き換える代わりに、このパラメーターを追加しようとしましたか?

spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;MODE=MYSQL

Test-application.propertiesの他の設定はすべて正常に読み取られました。

そのファイルにはapplication-test.properties

2
Slava Semushin

この設定で実行できました:

# for integration tests use H2 in MySQL mode
spring.datasource.url=jdbc:h2:mem:testdb;DATABASE_TO_LOWER=TRUE;MODE=MySQL;
spring.jpa.database-platform=org.hibernate.dialect.MariaDBDialect

ここでの主なトリックは、HibernateがMariaDBダイアレクトのSQLスクリプトを生成するように強制することです。

また、MariaDB 10.3にもっと新しいMariaDB103Dialectを使用しようとしましたが、正しく機能しませんでした。

0
stokito