gpt4 book ai didi

java - Junit 和 Jmock 测试 Springs TransactionSynchronizationManager

转载 作者:行者123 更新时间:2023-12-01 23:59:32 25 4
gpt4 key购买 nike

我有一些使用事务同步管理器的代码..但我似乎无法让它在模拟中工作..我 mock 实体管理器和事务管理器..以便我的上下文保存一个实体并调用提交... 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();
}

最佳答案

最近,我必须测试使用事务 Hook 的代码,经过一番调查后,我得到了以下解决方案:

源代码:

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 同步。要测试它,需要显式调用。

关于java - Junit 和 Jmock 测试 Springs TransactionSynchronizationManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15088319/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com