Spring TestContextフレームワークに複数のデータソースを使用するにはどうすればよいですか?
-
09-10-2019 - |
質問
Spring TestContextフレームワークとアプリケーションを統合しようとしています。私はこれを拡張してやった AbstractTransactionalJUnit4SpringContextTests
, 、 いつものように。ただし、私のアプリケーションには3つの異なるデータソース(Xdatasource、Ydatasource、Zdatasourceなどの名前があります)、テストを実行しようとすると、データソースの自動操作があります。 AbstractTransactionalJUnit4SpringContextTests
Autowire-byタイプのデータソースを探しているが、3つを見つけるため、動作しません。そのため、どちらを選択するかはわかりません。
Spring TestContextフレームワークを取得して3つのデータソースを使用する方法はありますか?もしそうなら;どうやって?
解決
わかりました、私はそれを理解しました。この質問に対する答えは2つあります。まず、拡張 AbstractTransactionalJUnit4SpringContextTests
うまくいきません。これは、を作成するための単一のデータソースが必要だからです SimpleJdbcTemplate
テストで簡単なJDBCクエリを使用したものを検証するため。このテストではこの機能を使用していないので、交換できます extends AbstractTransactionalJUnit4SpringContextTests
崩壊する構成で:
@ContextConfiguration(locations = "classpath:applicationContext.xml")
@RunWith(SpringJUnit4ClassRunner.class)
@TestExecutionListeners({
DependencyInjectionTestExecutionListener.class,
DirtiesContextTestExecutionListener.class,
TransactionalTestExecutionListener.class
})
@Transactional
public class IntegrationTest {
...
}
これらの注釈の組み合わせは、拡張と同じセットアップを与えます AbstractTransactionalJUnit4SpringContextTests
.
2番目の部分は、3つのデータソースがあるため、3つすべてが必要なので、同じもので参照されることを理解していたことでした。 PlatformTransactionManager
. 。トランザクションを配布しました。これはで不可能です DataSourceTransactionManager
, 、だから私はaを使用する必要がありました JtaTransactionManager
.
他のヒント
AbstractTransactionalJUnit4SpringContextTests
クラスは、注入されたものを提供する便利さを可能にするためにのみ、単一のデータソースに自動化されています JdbcTemplate
物体。オーバーライドできます setDataSource(DataSource dataSource)
からの方法 AbstractTransactionalJUnit4SpringContextTests
テストサブクラスで、次のように使用するデータソースを指定します。
@Resource(name = "dataSource")
public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
1つのデータソーススプリングの名前を使用する必要があります。 jdbcTemplate
便利な方法。拡張する場合 AbstractTransactionalJUnit4SpringContextTests
上記の他の方法よりも便利であるため、データソースのいずれかを選択するだけで、機能させることができます。
春のジラチケットでこれらの詳細を見つけました #SPR-4634.
データソースのいずれかを次のように定義できます primary="true"
XMLでは、選択されます。
すべての3つが必要な場合は、自動化に頼ることはできません - 使用 ReflectionTestUtils
テストで手動で設定します。