2011-07-26 180 views
2

我試圖創建TransactionTemplate的嘲諷TransactionTemplate的嘲笑

var tTemplate = MockRepository.GenerateMock<TransactionTemplate>(); 
var tDelegate = MockRepository.GenerateMock<ITransactionCallback>(); 
tTemplate.Expect(x => x.Execute(tDelegate)).IgnoreArguments().Throw(new Exception()); 

上最後一行的模擬我從

at Spring.Transaction.Support.TransactionTemplate.Execute(ITransactionCallback action) 

任何想法可能是什麼原因讓NullPointerException異常?

回答

1

Spring.Net中的TransactionTemplate類沒有虛方法,所以RhinoMocks在創建模擬時無法覆蓋Execute方法。

這意味着你實際上並沒有將Execute方法剔除,而是調用了真正的方法。該Execute方法調用您尚未提供的IPlatformTransactionManager對象,從而發生null異常。

考慮到Execute方法是ITransactionOperations接口的一部分,您可能可以脫離創建模擬ITransactionOperations對象並在測試的其餘部分使用該對象。

或者,您可以嘗試向TransactionTemplate類提供一個模擬IPlatformTransactionManager,以及使用tDelegate.Stub().Do()語法的ITransactionCallback.DoInTransaction()實現。

事情是這樣的:

var transactionManager = MockRepository.GenerateMock<IPlatformTransactionManager>(); 
var mockDelegate = MockRepository.GenerateMock<ITransactionCallback>(); 
mockDelegate.Stub(t => t.DoInTransaction(null)).IgnoreArguments().Do(...); 
var template = new TransactionTemplate(transactionManager); 
template.Execute(mockDelegate);