2013-02-26 87 views
0

我有一些代碼使用事務同步管理器..但我似乎無法得到它在嘲笑中工作..即時通訊模擬實體管理器和事務管理器..以便我的上下文保存實體和調用提交...在測試中,TransactionSynchronizationManager似乎沒有被擊中......Junit和Jmock來測試Springs 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();    
} 
+0

請清理後 – nav0611 2013-02-26 11:49:18

+0

吧?..如何..更多信息...更好的格式?... – user1555190 2013-02-26 11:54:20

+0

它現在由Don羅比格式化 – nav0611 2013-02-26 11:56:39

回答

0

我不知道我的理解,但如果你有一個模擬的事務管理器,那麼會是誰呼叫通知?

+0

是的,你是對的,我認爲模擬仍然會被外部調用,這又會調用sync..manager。 – user1555190 2013-03-01 16:25:40

3

最近我到哪裏,我不得不測試它使用事務鉤碼點經過一番調查中,我得到了以下解決方案:

源:

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同步不會被觸發。爲了測試它,明確的調用是必要的。