12

Spring Testは、テストメソッド内でデータベースに加えられた変更をロールバックするのに役立ちます。これは、各テストメソッドの前にテストデータを削除/再ロードするために時間をかける必要がないことを意味します。

ただし、@ BeforeClass Junitアノテーションを使用すると、データローダーが静的になります。ここで検討する質問: jUnitのfixtureSetupを静的にする必要があるのはなぜですか?

データ初期化メソッドが静的である場合は、データ接続メソッドとデータソースを静的にする必要があります。すべてを静的に強制する必要があります。これは機能しません。どの時点で、私は尋ねます-とにかくすべてのテストでテストデータを削除/再ロードする必要があるときに、変更をロールバックするSpringTestの機能は何が良いですか??!?!

4

5 に答える 5

14

有効なアプローチの1つは、「データ初期化」クラスを作成し、それをデータソースも含むテストSpringアプリケーションコンテキストに追加し、このアプリケーションコンテキストをテストに接続することです。これは、Springがテスト呼び出しの間にアプリケーションコンテキストをキャッシュするという事実に依存しています。

たとえば、テストスーパークラス:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:test-application-context.xml"})
@Transactional
public abstract class DataLoadingTest {
    @Autowired
    protected DatabaseInitialiser databaseInitialiser;
}

test-application-context.xml

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="dataSource" .../>

    <bean class="DatabaseInitialiser">
        <property name="dataSource" ref="dataSource"/>
    </bean>
</beans>

public class DatabaseInitialiser extends JdbcDaoSupport {
    @PostConstruct
    public void load() {
        // Initialise your database here: create schema, use DBUnit to load data, etc.
    }
}

この例では:

  • データベースに依存するすべてのテストは拡張されDataLoadingTestます。
  • Springは、最初のテスト呼び出し時にアプリケーションコンテキストを初期化します。
  • これは、アノテーションDatabaseInitialiser.load()を介してを呼び出します。@PostConstruct
  • Springはアプリケーションコンテキストをキャッシュに保持します。
  • さらにテスト呼び出しDatabaseInitialiserは、すでにキャッシュされているアプリケーションコンテキストから配線されます。
  • テストはトランザクションであり、最後に最初のデータセットにロールバックします。

同様に、テスト実行全体の最後に必要なロールバックを実行するためにDatabaseInitialiser、メソッドに注釈を付けることができます。@PostDestroy

于 2012-01-25T16:56:26.080 に答える
1

DBUnitをSpringTestと組み合わせて広く使用しています。ただし、テストの最後にデータを削除するためにDBUnit機能を使用することはありません。

テストを初期化するために、@Beforeメソッドにテストデータ用の一連のDBUnit挿入を配置します。次に、テストが完了したら、スプリングロールバック機能によってデータベースを元の状態に戻します。

これに関する最大の問題は、各テストの前にDBUnitデータをロードする必要があることです。これは、パフォーマンスに大きな打撃を与える可能性があります。DBUnitを使用したテストのほとんどは読み取り専用であり、特定の事前定義された動作に基づいてアプリケーションの動作をテストします。そのため、同じトランザクション内ですべての細粒度テストをバッチで実行するマスターテストを作成する習慣があります。

于 2011-06-28T09:19:42.980 に答える
0

SpringTestとDbUnitは2つの優れたフレームワークです。しかし、それらを組み合わせることは意味がありません。Spring Testは接続に対してロールバックを実行するため、後でクリーンアップし、DbUnitはクリーンアップして@Beforeメソッドにテストデータを挿入します。

動的データに依存しない場合はSpringを使用し、そうでない場合はdbUnitを使用します。

于 2010-06-10T14:02:57.637 に答える
0

@BeforeTransactionで注釈が付けられたメソッドは、その名前が示すように、各テストのトランザクションが開始される前に実行されます。このような方法でテストデータがロードされているかどうかを検出できる場合は、必要に応じてデータをロードできます。

ただし、以降のすべてのテストのために、データは(メモリ内の)データベースに残されることに注意してください。

これを使用して「静的」データをロードします。このデータは、実稼働環境では、起動時にデータベースにブートストラップされます。このようにして、古くなる可能性のある(DbUnit)エクスポートに依存するのではなく、実際にテストにまったく同じコードとデータを使用します。

于 2013-01-31T11:49:38.630 に答える
0

構成は1回だけ実行されるため、データ初期化子「bean」を作成できます。それは主な答えと同じ原則に従いますが、コードとクラスが少なくなります

@Configuration
class DBUnitTest_Config {
  protected String PATH = "";

  @Bean
  public DataSetConfig setupData(DataSource dataSource) throws SQLException {
    DataSetExecutorImpl executor = DataSetExecutorImpl.instance(new ConnectionHolderImpl(dataSource.getConnection()));
    DataSetConfig dataSetConfig = new DataSetConfig(PATH);
    executor.createDataSet(dataSetConfig);
    return dataSetConfig;
  }

}
于 2021-02-22T17:22:36.707 に答える