私は春のブートアプリケーションを持っています。これには、いくつかの@Entity
クラスと@RepositoryRestResource
リポジトリインターフェイスがあります。次に、これらのリポジトリを使用してデータベースに新しいレコードを追加できることを確認できるいくつかのテストを記述しますが、構成済みのMySQLデータベースを使用したくないが、代わりにいくつかの埋め込みデータベースを使用したいH2のように。現時点では、次のようなapplication.properties
ファイルがあります。
spring.jpa.hibernate.ddl-auto=create
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=qwerty123
質問:テストに他のデータベースを使用するようにアプリを構成するにはどうすればよいですか?私のプロジェクトにはxmlがありません。すべて注釈に基づいています。 @Configuration
で@Bean
クラスを定義してDataSource
を作成し、テストクラスで@ContextConfiguration
アノテーションを付けて使用しようとしましたが、コンテキストをロードできないと表示されています。
Mavenプロジェクトを使用している場合は、application.properties
ファイルをsrc/test/resources
、たとえば次のコンテンツ。
# Create DDL
spring.jpa.hibernate.ddl-auto=create
# H2 in local file system allowing other simultaneous connections
spring.datasource.url=jdbc:h2:~/test;AUTO_SERVER=TRUE
また、依存関係としてH2を含める必要があります(pom.xml
):
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.193</version>
</dependency>
Spring Bootは、テスト用のJPA自動構成に関連する2つの魔法の注釈、@DataJpaTest
および@AutoConfigureTestDatabase
を提供します。 javadocは言う:
デフォルトでは、@ DataJpaTestで注釈が付けられたテストは、埋め込みのインメモリデータベースを使用します(明示的または通常は自動構成されたDataSourceを置き換えます)。 @AutoConfigureTestDatabaseアノテーションを使用して、これらの設定をオーバーライドできます。
完全なアプリケーション構成をロードしようとしているが、組み込みデータベースを使用している場合は、このアノテーションではなく@AutoConfigureTestDatabaseと組み合わせた@SpringBootTestを検討する必要があります。
したがって、絶対に必要なのはpomファイルの依存関係だけです。
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>test</scope>
</dependency>
それでおしまい。ただし、春のブーツの仕様にも2つの有用な警告があります。
接続URLを提供する必要はありません。使用する組み込みデータベースへのビルド依存関係のみを含める必要があります。テストでこの機能を使用している場合は、使用するアプリケーションコンテキストの数に関係なく、同じデータベースがテストスイート全体で再利用されることがあります。各コンテキストに個別の埋め込みデータベースがあることを確認するには、spring.datasource.generate-unique-nameをtrueに設定する必要があります。
そしてもう一つ:
何らかの理由で、組み込みデータベースの接続URLを構成する場合は、データベースの自動シャットダウンが無効になっていることを確認してください。 H2を使用する場合は、DB_CLOSE_ON_EXIT = FALSEを使用してください。 HSQLDBを使用する場合は、shutdown = trueを使用しないようにする必要があります。データベースの自動シャットダウンを無効にすると、データベースが閉じたときにSpring Boot制御が可能になり、データベースへのアクセスが不要になったときにそれが確実に実行されます。
Spring Bootと組み込みDBについて知っておくべきことは、これでほぼすべてです。アプリケーションランタイムの組み込みDBを実際に意図的に構成しない限り、test
以外の依存関係のスコープを使用する理由はまったくありません。信じられないかもしれませんが、H2瓶だけでは脂肪瓶の中に1.8Mが入ります。細かいマイクロサービス、サーバーレス、ラムダ関数の世界では、アプリ内に何を配置するかが重要です。
@AutoConfigureTestDatabaseのオプションを確認することもお勧めします。私はそれを@SpringBootTestで使用しますが、他のいくつかのアノテーション、つまり上記の@DataJpaTestでも使用できます。
Springプロファイルを使用する必要があります- https://docs.spring.io/spring-boot/docs/current/reference/html/howto-properties-and-configuration.html#howto-set-active-ばねプロファイル
"spring.profiles.active = development"を使用してアクティブプロファイルを定義し、開発プロファイルにH2を含めます。
例ではYAMLを使用していますが、標準のプロパティファイルでも機能します。