有効なアプローチの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