2011-07-26 181 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);