我有一些使用事务同步管理器的代码..但我似乎无法让它在模拟中工作..我嘲笑实体管理器和事务管理器..以便我的上下文保存实体并调用提交...在测试中,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 :(得分:3)
最近我到了必须测试使用事务挂钩的代码的地步,经过一些调查我得到了以下解决方案:
的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
}
默认情况下,测试设置为回滚,因此不会触发提交同步。要测试它,必须进行显式调用。
答案 1 :(得分:0)
我不确定我理解,但如果你有一个模拟交易经理,那么谁会打电话给通知人?
答案 2 :(得分:0)