1

バージョンが維持されているかどうかを確認するためにJUnitを作成します(イベントで)。JUnitを使用して行ったことは次のとおりです。

@Test
Public void testAudit() {
    try {
        //create Dao code
        dao.save();  //This will create entry in  AUD- and REVINFO-tables perfectly
        SomeObject obj = SomeHelper.getAuditData(dao));
        /*Method to be tested which generates audit message using envers i.e(dao created)*/
        //Some logic to check if output is as expected  
    }
    catch(Exception e) {
        Assert.fail();
    }
    finally {
        dao.delete();  //delete the data saved by JUnit (Problem starts here )
    }
}

dao の削除を呼び出すと、

UnsupportedOperationException: 読み取り専用オブジェクトに書き込めません

キャッシュにはEhcacheを使用しています。CacheConcurrencyStrategy問題をグーグルで調べたところ、削除したいドメインオブジェクトの設定が間違っていることが原因である可能性があることがわかりました。私がチェックしました。

ドメイン オブジェクトには がありませんでしCacheConcurrencyStrategyた。しかし、ネストされたオブジェクトは次のようにCacheConcurrencyStrategy設定されていましたREAD_WRITE(これが本当の犯人かもしれません)。

しかし、既存のドメインと既存のコードを変更したくありません。CacheConcurrencyStrategyJUnitをバイパスする方法はありますか? そうでない場合、既存のコードを変更せずに解決する方法はありますか?

4

1 に答える 1

2

ENVERs データはトランザクションのコミット後に書き込まれるため、監査レコードがまだ存在しないため、コードが監査レコードにアクセスすることはありません。ENVER をテストする場合は、自分でトランザクションを管理する必要があります。以下に例を示します。

@Before
public void setup() {
    // Envers audit information is written via post-event listeners and therefore the transaction needs to be
    // committed.
    PlatformTransactionManager txMgr = applicationContext.getBean(PlatformTransactionManager.class);
    TransactionStatus status = txMgr.getTransaction(new DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_REQUIRES_NEW));
    Account account = accountDAO.getByUsername(UPDATE);
    if (account != null) {
        accountDAO.delete(account);
    }

    account = createAccount();
    account.setUsername(INITIAL);
    accountDAO.update(account);
    txMgr.commit(status);

    status = txMgr.getTransaction(new DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_REQUIRES_NEW));
    account.setUsername(UPDATE);
    accountDAO.update(account);
    txMgr.commit(status);

}

次に、テストで、必要に応じて監査情報を照会できます (生の SQL、AuditReader 経由など)。

于 2016-03-26T19:53:46.573 に答える