2013-02-26 42 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同步不会被触发。为了测试它,明确的调用是必要的。