1

内部で jdbcTemplate.batchUpdate メソッドを使用する dao をテストしようとしています。

私のテストは実際のデータソースに対して実行され、すべてのメソッドはロールバックのみとしてマークされたトランザクションで実行されます (すべての変更はテスト後にロールバックされます)。テスト トランザクションはPlatformTransactionManagerによって管理されます。

ここでの問題は、jdbcTemplate.batchUpdate がDataSourceTransactionManagerによって開始された別のトランザクションで実行されているように見えるため、jdbcTemplate によって行われた変更が表示されないことです。

私のテスト:

@Transactional
@TransactionConfiguration(transactionManager = "txManager", defaultRollback = true)
@RunWith(SpringJUnit4ClassRunner.class)
public abstract class AbstractDbUnitTest
...
@Test
public void removeSpecific() {
    myDao.removeSpecific(myDao.findAllAliasedItems());
    Assert.assertEquals(0, myDao.findAllAliasedItems().size());
}

ダオ

@Override
public void removeSpecific(final List<? extends Item> items) {
    jdbcTemplate.batchUpdate("delete from ITEM where item_type = ? and item_id = ?", new BatchPreparedStatementSetter() {
        @Override
        public void setValues(PreparedStatement ps, int i) throws SQLException {
            ps.setString(1, items.get(i).getType().name());
            ps.setString(2, items.get(i).getId(););
        }

        @Override
        public int getBatchSize() {
            return items.size();
        }
    });
}

実際にデータを変更せずに batchUpdate メソッド項目をテストする方法はありますか? 前もって感謝します。

4

1 に答える 1

0

誤解を招いてしまい申し訳ありません。この問題は、ネストされたトランザクションが原因ではありませんでした。この質問は、Java のトランザクション関連クラスの階層と、JDBC のバッチ ステートメントの実装方法についての私の完全な誤解の結果です。

への後続の呼び出しのため、テストは失敗していました

myDao.findAllAliasedItems()

キャッシュされました。Spring JDBC テンプレートは問題なく機能し、予想どおりでした。

于 2013-05-31T15:47:52.620 に答える