c# - 使用 Rhino 模拟从 Spring.Net 模拟 TransactionTemplate

标签 c# .net rhino-mocks spring.net

我正在尝试创建 TransactionTemplate 的模拟

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

在最后一行我从中得到了 NullPointerException

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

知道可能是什么原因吗?

最佳答案

Spring.Net 中的 TransactionTemplate 类没有虚方法,因此 RhinoMocks 无法在您创建模拟时覆盖 Execute 方法。

这意味着您实际上并没有删除 Execute 方法,而是调用了真正的方法。该 Execute 方法调出您尚未提供的 IPlatformTransactionManager 对象,因此会发生 null 异常。

鉴于 Execute 方法是 ITransactionOperations 接口(interface)的一部分,您可以创建一个模拟 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);

关于c# - 使用 Rhino 模拟从 Spring.Net 模拟 TransactionTemplate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6830294/

相关文章:

c# - C# 3.0+ 中属性和字段的区别

c# - 除了 native UUID 之外,数据库中 UUID 最有效的数据类型

c# - 如何计算 WPF 中的非客户端窗口大小?

c# - Notepad++ 的 Compare 插件算法

nunit - 测试模拟对象 rhino 模拟

rhino-mocks - 使用正确的对象类型调用 Rhino Mocks Assert Property Setter

c# - string.Length 与 string.ToCharArray().Length

c# - 从对象子列表中删除项目 (LINQ)

c# - 我如何知道何时/什么正在加载某些程序集?

.net - 犀牛模拟中的部分参数匹配