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
})
上記の答えはすべて、テスト用に.sqlスキーマを持たなければならない.sqlスキーマロードテクニックを使用しています。スキーマが拡張されるため、そのようにしたくありませんでした。テストの拡張時にスキーマにエントリを追加するという面倒な作業は避けたいと思います。
Spring Bootを使用しているときに、最初にbootRun
を実行してからテストを実行することで問題を解決するように見えるこの注釈に出会いました。
私のテスト注釈では、@ContextConfigurations
with @SpringApplicationConfiguration
そして、すべてのクラスを同じままにしました。これで問題が解決したようです。そこでtest
タスクがbootRunを呼び出してクラスをロードし、thenがテストを実行します。
@ SpringApplicationConfiguration を参照してください
これが同じ問題に直面している人に役立つことを願っています。
@Before
JUnitフックから明示的に実行したくない場合は、さまざまなオプションがあります。
schema.sql
またはdata.sql
をsrc/test/resources
フォルダーに配置して、テスト中にのみ取得されるようにします。たとえば、@ Sqlアノテーションを使用してDBにデータを入力できます^
@Sql(scripts = "classpath:db/populateDB.sql")