web-dev-qa-db-ja.com

Spring Bootテストの前にデータベースを初期化する

JUnitを使用してアプリケーションをテストしていますが、テストの前にデータベースが初期化されていれば(gradle bootRunを使用してWebアプリとして実行する限り)すべてが正常に機能します。ただし、データベースが空の場合、アプリケーションはテスト前にモデルやエンティティを初期化しないようです。これを行うことになっている方法はありますか? ApplicationRunnerクラスはテストの前に実行され、エンティティを初期化することを想定しました。これを行う方法はありますか、間違ったアプローチを使用していますか?

これは私のapplication.propertiesファイルがどのように見えるかです:

server.port=8090
server.ssl.key-store=classpath:keystore.jks
server.ssl.key-store-password=123456
server.ssl.key-password 123456
spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect
spring.jpa.hibernate.ddl-auto=create
spring.jpa.hibernate.naming-strategy:org.hibernate.cfg.ImprovedNamingStrategy
application.logger.org.springframework=INFO

データベースは、DriverManagerDataSource接続を使用して/src/main/Java/application/persistence/DbConfig.Javaに保存されます。そして、ApplicationRunnerをセットアップして、起動時にdbに数行追加します。

編集:

また、これらがJUnitテストファイルで使用している注釈であることも追加する必要があります。

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(classes={
    AdeyTrackApplication.class, 
    SecurityConfig.class, 
    WebConfig.class,
    AuthorizationController.class
    })
15
px06

上記の答えはすべて、テスト用に.sqlスキーマを持たなければならない.sqlスキーマロードテクニックを使用しています。スキーマが拡張されるため、そのようにしたくありませんでした。テストの拡張時にスキーマにエントリを追加するという面倒な作業は避けたいと思います。

Spring Bootを使用しているときに、最初にbootRunを実行してからテストを実行することで問題を解決するように見えるこの注釈に出会いました。

私のテスト注釈では、@ContextConfigurations with @SpringApplicationConfigurationそして、すべてのクラスを同じままにしました。これで問題が解決したようです。そこでtestタスクがbootRunを呼び出してクラスをロードし、thenがテストを実行します。

@ SpringApplicationConfiguration を参照してください

これが同じ問題に直面している人に役立つことを願っています。

4
px06

@Before JUnitフックから明示的に実行したくない場合は、さまざまなオプションがあります。

  1. Spring BootのJDBC初期化機能 を使用して、schema.sqlまたはdata.sqlsrc/test/resourcesフォルダーに配置して、テスト中にのみ取得されるようにします。
  2. Springの@Sqlアノテーション を使用します
28
luboskrnac

たとえば、@ Sqlアノテーションを使用してDBにデータを入力できます^

@Sql(scripts = "classpath:db/populateDB.sql")
2
MxWild