簡體   English   中英

Junit和Jmock測試Springs TransactionSynchronizationManager

[英]Junit and Jmock to test Springs TransactionSynchronizationManager

我有一些使用事務同步管理器的代碼..但是我似乎無法使其在模擬中工作。.im正在模擬實體管理器和事務管理器..以便我的上下文可以保存實體並調用提交... TransactionSynchronizationManager可以似乎沒有受到打擊...在測試中?

   this.transactionTemplate.execute(new TransactionCallback<E>() {
                @Override
                public E doInTransaction(TransactionStatus status) {    
                    // update entities


                    TransactionSynchronizationManager.registerSynchronization(new NotificationTransactionSynchronization(){
                       @Override
                       public void afterCommit() {
                    // do some post commit work
                                   int i = notifier.notifyAllListeners();
                       }
                    });

                }
            });

我的測試課:

@Test
public void testHappyPath() {


    context.checking(new Expectations() {
        {
            allowing(platformTransactionManager).getTransaction(definition);
            will((returnValue(status)));

            oneOf(platformTransactionManager).commit(status);

                         //next line never gets hit... so the test fails...
                         //if i remove it will pass but i need to check that it works...

            oneOf(mockNotifier).notifyAllListeners();

        }
    });
    this.TestClass.process();
    context.assertIsSatisfied();            
}   

最近,我到了必須測試使用事務掛鈎的代碼的位置,經過一番調查,我得到了以下解決方案:

src:

public void methodWithTransactionalHooks() {

    //...

    TransactionSynchronizationManager.registerSynchronization(
        new TransactionSynchronizationAdapter() {
            public void afterCommit() { 
                // perform after commit synchronization
            }
        }
    );

    //...
}

測試:

@Transactional
@Test
public void testMethodWithTransactionalHooks() {

    // prepare test

    // fire transaction synchronizations explicitly
    for(TransactionSynchronization transactionSynchronization 
        : TransactionSynchronizationManager.getSynchronizations()
    ){
        transactionSynchornization.afterCommit();
    }

    // verify results
}

默認情況下,測試設置為回滾,因此afterCommit同步不會被觸發。 要測試它,顯式調用是必要的。

我不確定我是否理解,但是如果您有模擬交易管理器,那么誰來呼叫通知者?

我遇到了同樣的問題,以我為例

@Rollback(false)

對測試方法有所幫助。

參見https://stackoverflow.com/a/9817815/1099376

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM