Spring Bootのテスト中にプロパティをピックアップしないH2組み込みデータベース -- java フィールド と spring フィールド と spring-boot フィールド と junit フィールド と h2 フィールド 関連 問題

H2 Embedded database not picking up properties during test on spring boot












6
vote

問題

日本語

埋め込みH2データベースを使用するテストを作成しようとしています。しかし、私はspring.datasource.urlを変更する必要があります、私はSpring Bootによって作成されたデフォルトのものを使用することはできません。 (これは、H2データベースのモードをMySQLに変更する必要があるためです)

これは私の test class

です。 <事前> <コード> @JdbcTest @RunWith(SpringRunner.class) @ActiveProfiles("test") public class DemoApplicationTests { @Autowired JdbcTemplate jdbcTemplate; @Autowired DataSource dataSource; @Test public void contextLoads() { System.out.println(dataSource); } }

これは私の application-test.properties

です。 <事前> <コード> spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;MODE=MYSQL spring.datasource.username=dbuser spring.datasource.password=dbpass

私の依存関係:

<事前> <コード> compile('org.springframework.boot:spring-boot-starter-batch') runtime('com.h2database:h2') compile group: 'org.springframework.boot', name: 'spring-boot-starter-jdbc', version: '1.5.3.RELEASE' compile group: 'org.springframework.boot', name: 'spring-boot-starter-test', version: '1.5.3.RELEASE'

コンソール出力:

埋め込みデータベース:URL = 'jdbc:h2:MEM:BFAD6B71-3E2D-4A47-A32D-C76988B3C5F6; db_close_delay = -1; db_close_on_exit = false'、username = 'sa'

URLがこのようなものになると予想されます。<コード> jdbc:h2:mem:testdb 、<コード> MODE=MYSQL 設定をピックアップしたいです。

私はこの記事がうまくいきませんでした。

英語

I am trying to create a test that uses an embedded H2 database. But I have to change the spring.datasource.url, I cannot use the default one that is created by spring boot. (this is because I have to change the mode of the H2 database to MYSQL)

This is my test class:

@JdbcTest @RunWith(SpringRunner.class) @ActiveProfiles("test") public class DemoApplicationTests {      @Autowired     JdbcTemplate jdbcTemplate;      @Autowired     DataSource dataSource;      @Test     public void contextLoads() {         System.out.println(dataSource);    } } 

This is my application-test.properties:

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

My dependencies:

compile('org.springframework.boot:spring-boot-starter-batch') runtime('com.h2database:h2') compile group: 'org.springframework.boot', name: 'spring-boot-starter-jdbc', version: '1.5.3.RELEASE' compile group: 'org.springframework.boot', name: 'spring-boot-starter-test', version: '1.5.3.RELEASE' 

The console output:

Starting embedded database: url='jdbc:h2:mem:bfad6b71-3e2d-4a47-a32d-c76988b3c5f6;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false', username='sa'

I would expect the url to be something like this: jdbc:h2:mem:testdb, I also want it to pick up the MODE=MYSQL setting.

I tried to follow this post, but it didn't work.

</div
              

回答リスト

4
 
vote
vote
ベストアンサー
 

Spring Bootの<コード> @DataJdbcTest 、<コード> 9988777668 、<コード>、 doctrine_migrations: migrations_paths: 'DoctrineMigrations': 'src/MigrationsDefault' connection: default 0 はすべて呼び出しを終わらせる doctrine_migrations: migrations_paths: 'DoctrineMigrations': 'src/MigrationsDefault' connection: default 1 は、デフォルトでは、自動生成された一意の名前を持つインメモリ内蔵データベースインスタンスを設定します。

それはあなたに問題を与えるかもしれません。 H2は、カタログ名がデータベース名と同じになるように、非空白の<コード> doctrine_migrations: migrations_paths: 'DoctrineMigrations': 'src/MigrationsDefault' connection: default 3 属性で doctrine_migrations: migrations_paths: 'DoctrineMigrations': 'src/MigrationsDefault' connection: default 2 でJPAエンティティを使用することができます。 Dane Savotが彼の答えに言った

<事前> <コード> doctrine_migrations: migrations_paths: 'DoctrineMigrations': 'src/MigrationsDefault' connection: default 4

そのテストクラスの問題を解決しますが、グローバルに解決したい場合は、

を追加 <事前> <コード> doctrine_migrations: migrations_paths: 'DoctrineMigrations': 'src/MigrationsDefault' connection: default 5

<コード> doctrine_migrations: migrations_paths: 'DoctrineMigrations': 'src/MigrationsDefault' connection: default 6 または<コード> doctrine_migrations: migrations_paths: 'DoctrineMigrations': 'src/MigrationsDefault' connection: default 7 。そのプロパティは<コード> doctrine_migrations: migrations_paths: 'DoctrineMigrations': 'src/MigrationsDefault' connection: default 8 の動作を制御します。

 

Spring Boot's @DataJdbcTest, @DataJpaTest and @JdbcTest, through @AutoConfigureTestDatabase will all end up calling TestDatabaseAutoConfiguration, which in turn, by default, will configure an in-memory embedded database instance with an auto generated unique name.

That may give you problems if, e.g. you happen to use an JPA Entity with a @Table with a non-blank catalog attribute, as H2 requires that catalog name to be the same as its database name.

As Dane Savot said in his answer

@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) 

will solve the problem for that test class, but if you want to solve it globally, add

spring.test.database.replace=none 

to your src/test/resources/application.properties or .yaml. That property controls @AutoConfigureTestDatabase.replace's behavior.

</div
 
 
8
 
vote

ランダム埋め込みデータベース名を次のように置き換えないようにSpringに指示する必要があります。

@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.replace.none)

それはあなたがapplication.propertiesで宣言されたプロパティをピックアップするべきです。

あなたのために働くかどうかを気軽に告げてください。

 

You need to tell Spring not to replace the random embedded database name with the following:

@AutoConfigureTestDatabase(replace= AutoConfigureTestDatabase.Replace.NONE)

It should then pick up properties you declared in application.properties.

Please feel free to commend whether or not it works for you.

</div
 
 
2
 
vote

これは私にとって働くものです

<事前> <コード> doctrine_migrations: migrations_paths: 'DoctrineMigrations': 'src/MigrationsDefault' connection: default 9

このクラスをすべての関連DB統合クラスの基本として使用します。

 

This is something that works for me

@RunWith(SpringRunner.class) @TestPropertySource(locations = "classpath:application-mysql.properties") @SpringBootTest public abstract class ExternalDbApplicationTestBase {  } 

I use this class as a base for all related db integration classes.

</div
 
 
   
   

関連する質問

5  Spring Boot JPA H2コンソールが実行されていない、application.propertiesファイルは無視されます  ( Spring boot jpa h2 console not running application properties file ignored ) 
スプリングブーツガイドは、H2コンソールを手に入れることができると言っていますが、それは私のために働いていません。 http:// localhost:8080 / h2 / WhiteLabelのエラーページ このアプリケーションには明示的なマッ...

0  Fedora 15では、Fedora getting org.h2.jdbc.jdbcsqlExceptionの上のリフトアプリを開始する  ( On fedora 15 start lift app on fedora getting org h2 jdbc jdbcsqlexception ) 
Fedora 15では、MVN Jettyを行った後:run、私はユーザーのためのメタマプパーを初期化しようとしているときに次のような抜粋を得ています <事前> <コード> org.h2.jdbc.JdbcSQLException: Exception op...

1  H2のMySQL互換モードはMySQLの「Set」タイプをサポートしますか?  ( Does h2s mysql compatibility mode support mysqls set type ) 
列挙型をサポートしているのがわかりますが、セットタイプ( https://dev.mysql.com/doc/refman/5.7/en/set.html ) H2がそれをサポートしていない場合、より完全なMySQLサポートが完全に完全なメモリ内データベース...

1  リレーショナルデータベースSpring Boot JPA / Hibernateの外部キー  ( Relational database foreign keys in spring boot jpa hibernate ) 
卒業用のSpring Boot JPAを使用しています。 Spring Bootのための正しい構文を持つリレーショナルデータベースの作成上のフォーカスに従うことができるガイドを見つけるのに苦労しています。私は外出しましたが、私はこのエラーを入手します <事前>...

3  MEMSQLとH2の比較  ( Memsql and h2 comparison ) 
H2からMemsqlへの移動を検討しています - そして私はコメントを大いに感謝するでしょう: 私のアプリケーションは、最大300000リオンの大きさの大きなテーブルから非常に迅速に照会する必要があります。これを達成するために、H2インメモリデータベースを使...

14  H2データベース/スプリングブートアプリケーションでJDBCSQLException(16進文字以外の文字)を取得しているのはなぜですか。  ( Why am i getting jdbcsqlexception non hex characters with my h2 database spr ) 
SHOR SHORTバージョン、私はある種の文字エンコーディングの問題を推測しています。 しかし、私は何が間違っているのかうまくいくことができるならば、私は狂っています! Hibernate 5を使用してEntity PropsのJ8 Localdate...

0  almliteの列名= "` `group`"でQueryBuilderを使用できません  ( Cannot use querybuilder with column name group in ormlite ) 
コード <事前> <コード> class Record(Model, Base): """""" __tablename__ = "records" NAME = Column(String, primary_key ...

2  H2 Insert重複キー更新で選択をスローします。「固有のインデックスまたは主キー違反」エラー  ( H2 insert select on duplicate key update throws unique index or primary key vio ) 
H2(MODE = MODE = MYSQLで開始)は、VALUES句のみで重複キーupdateステートメントの挿入をサポートしますが、INSERT SELECTステートメントを使用すると「固有のインデックスまたは主キー違反」エラーが発生します。 これは例で...

4  Spring Roo:JDBCドライバは 'org.h2.driver'で利用できません  ( Spring roo jdbc driver not available for org h2 driver ) 
Ubuntu Linux、Spring Tools 2.7.1、Spring RoO 1.1.5でEclipse Indigoを実行しています。 roo の入門reo を使い始め、DBリバースエンジニアリングを試すと'次のエラー: <事前> <コード> r...

1  H2データベースタイムスタンプNULLをインサートします  ( H2 database timestamp insert null ) 
良い日、 私のH2データベースにタイムスタンプを消去する必要があります。値を設定できますが、NULL /クリアに設定できません。 コマンドとは何ですか? <事前> <コード> UPDATE TABLE SET DATE='null' WHERE USERNAM...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有