6

私は、DAOを介してOracleデータベースに情報をコミットし、それを取得してすべてが変更されていないことを確認する単体テストに取り組んでいます。

テストクラスには他の単体テストがあり、クラスの上部には次のものがあります。

@TransactionConfiguration (defaultRollback = true)

@NotTransactional を削除する方法を知りたいです。クラスで Transactional を指定していないため、デフォルトではそのようなテストはありません。これは独自のテストであるため、@BeforeTransaction (または After) アノテーションが正しいかどうかはわかりません。

最大の問題は、@NotTransactional がないと、unsubscribe() 関数が実行されていないように見えることです。(ごみ箱フラグは変更されません。)

@rollback=false と @NonTransactional が存在する状態でテストを再度実行すると、テストが終了した後、データベースでごみ箱フラグが正しく true に設定されていることがわかります。

@RunWith (SpringJUnit4ClassRunner.class)
@TransactionConfiguration (defaultRollback = true)
public class DatabaseTest {

    @Autowired (required = true)
    private FooDao<Foo> fooDao;

    @Autowired (required = true)
    private FooService fooService;

    // other tests here that are marked @Transactional.

    @Test
    @NotTransactional
    public void testDelete() {
        Foo foo = new foo();
        foo.setTrashFlag(false);
        foo.setId(123);

        fooDao.create(foo);

        Foo fooFromDb = fooService.getFromDbById(123);
        assertNotNull(fooFromDb);

        fooService.unsubscribe(123);   // among other things, 
                                       // **sets trash flag to true.**

     // sqlSession.flushStatements();  // doesn't seem to commit the unsubscribe action


        // getFromDbById() returns ONLY Foos with trash set to false, so we expect
        // nothing returned here as we've just set trash to true, using unsubscribe().

        Foo trashedFoo = fooService.getFromDbById(123);   
        assertNull(trashedFoo);

ありがとう!

4

2 に答える 2

6

@Rollback(false)常に十分であるとは限りません。テストの最後にトランザクションがロールバックされないことを意味するだけです。ただし、トランザクション内でテストを実行するため、実行中の他のトランザクションと競合する場合があります。

Spring が提案するように、次の 2 つのオプションがあります。

  1. テスト クラスを 2 つに分割します。トランザクション テストは で注釈が付けられたテスト クラス@Transactionalであり、非トランザクション テストはトランザクション アノテーションのないテスト クラスです。
  2. クラス アノテーションの代わりにメソッド アノテーションを使用し、各トランザクション テストに でアノテーションを付けます@Transactionalが、クラス スコープからは削除します

Springのドキュメントを引用:

Spring 3.0 の時点で@NotTransactional、非トランザクション テスト メソッドを別の (非トランザクション) テスト クラスまたは@BeforeTransactionor@AfterTransactionメソッドに移動することを支持して非推奨になりました。クラス全体に で注釈を付ける代わりに、@Transactional個々のメソッドに@Transactional;で注釈を付けることを検討してください。そうすることで、 を使用しなくても、同じテスト クラスでトランザクション メソッドと非トランザクション メソッドを混在させることができます@NotTransactional

于 2013-03-21T09:27:05.477 に答える