[英]How to test protected methods of abstract class using JUnit and JMock
[英]Junit and Jmock to test Springs TransactionSynchronizationManager
我有一些使用事務同步管理器的代碼..但是我似乎無法使其在模擬中工作。.im正在模擬實體管理器和事務管理器..以便我的上下文可以保存實體並調用提交... 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();
}
最近,我到了必須測試使用事務掛鈎的代碼的位置,經過一番調查,我得到了以下解決方案:
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
}
默認情況下,測試設置為回滾,因此afterCommit同步不會被觸發。 要測試它,顯式調用是必要的。
我不確定我是否理解,但是如果您有模擬交易管理器,那么誰來呼叫通知者?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.