2013-02-26 1 views
0

У меня есть код, в котором используется диспетчер синхронизации syschronisation .. но я не могу заставить его работать в mocks .. im mocking менеджер сущностей и диспетчер транзакций .. так что мой контекст сохраняет сущность и вызов commit ... 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

+0

да? .. как .. подробнее ... лучше форматирования? ... – user1555190

+0

Его сейчас отформатирован Дон Роби – nav0611

ответ

0

Я не уверен, я понимаю, но если у вас есть макет менеджер транзакций, то кто будет называть уведомитель?

+0

да вы правы, я принял издеваться все равно будет вызван чем-то внешним, что в свою очередь вызовет sync..manager. – user1555190

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 
} 

Тест по умолчанию установлен на откат, поэтому после синхронизации синхронизации не будет. Для его проверки необходим явный вызов.

Смежные вопросы