1. ホーム
  2. java

[解決済み] Springでテスト前にデータベースを再作成するには?

2023-05-13 02:01:18

質問

私のSpring-Boot-Mvc-Webアプリケーションには、以下のデータベース構成があります。 application.properties ファイルにあります。

spring.datasource.url=jdbc:h2:tcp://localhost/~/pdk
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.driver-class-name=org.h2.Driver

私が作った設定はこれだけです。他の設定は一切していません。とはいえ、Springとサブシステムは、Webアプリケーションの実行ごとに自動的にデータベースを再作成します。データベースは、アプリケーション終了後にデータがある間は、システム実行時に再作成されます。

私はこのデフォルトを理解していなかったので、これはテストに適していると期待していました。

しかし、テストを実行し始めると、データベースが一度だけ再作成されることがわかりました。テストは事前に定義された順序で実行されないので、これは全く意味がありません。

そこで質問です。 はどのように意味をなすのでしょうか?すなわち アプリケーションの初回起動時に発生するように、各テストの前にデータベースを再作成する方法?

私のテストクラスのヘッダーは次のとおりです。

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = myapp.class)
//@WebAppConfiguration
@WebIntegrationTest
@DirtiesContext
public class WebControllersTest {

ご覧のように、私は @DirtiesContext をクラスレベルで試してみましたが、役に立ちませんでした。

UPDATE

私はビーン

@Service
public class DatabaseService implements InitializingBean {

というメソッドを持っていて

@Override
    @Transactional()
    public void afterPropertiesSet() throws Exception {
        log.info("Bootstrapping data...");
        User user = createRootUser();
        if(populateDemo) {
            populateDemos();
        }
        log.info("...Bootstrapping completed");
    }

ここで、私はそれを populateDemos() メソッドでデータベースからすべてのデータをクリアするようにしました。残念ながら、このメソッドは @DirtiesContext . なぜでしょうか?

どのように解決するのですか?

実は、こんなことがしたいのでは?

@DirtiesContext(classMode = ClassMode.BEFORE_EACH_TEST_METHOD)

http://docs.spring.io/autorepo/docs/spring-framework/4.2.6.RELEASE/javadoc-api/org/springframework/test/annotation/DirtiesContext.html

<ブロッククオート

DirtiesContextは同じクラス内でクラスレベルおよびメソッドレベルのアノテーションとして使用することができます。 アノテーションとして使用することができます。そのようなシナリオでは ApplicationContext は、そのようなアノテーションを付けたメソッドの後でも、クラス全体の後でも、ダーティとしてマークされます。 メソッドの後、およびクラス全体の後にダーティとしてマークされます。もし DirtiesContext.ClassMode が AFTER_EACH_TEST_METHOD に設定されている場合、コンテキストは、クラス内の各テストメソッドの後にダーティとマークされます。 はクラス内の各テストメソッドの後にダーティとマークされます。

Testクラスに貼るんですね。