如何在C#中使用Rhinomock忽略方法内的指定方法调用?
如何用RhinoMocks忽略方法内部的
MyMethodToIgnore调用 当然可以!RhinoMocks提供了几种灵活的方式来处理这类场景,具体要根据MyMethodToIgnore的归属(是依赖对象的方法,还是被测试类自身的方法)来选择方案,下面分两种常见情况给你详细示例:
场景1:MyMethodToIgnore是依赖对象的方法
如果MyMethodToIgnore属于被测试类依赖的外部服务,你只需要给这个依赖创建一个Stub,预设它的返回值,就能跳过真实方法的执行逻辑。
比如我们有这样的代码结构:
// 依赖的服务接口 public interface IExternalService { string MyMethodToIgnore(); } // 被测试类 public class TargetClass { private readonly IExternalService _service; public TargetClass(IExternalService service) { _service = service; } public string MethodUnderTest() { // 内部调用了要忽略的方法 var ignoredValue = _service.MyMethodToIgnore(); return $"Final: {ignoredValue}"; } }
对应的测试代码可以这么写:
[Test] public void MethodUnderTest_SkipsMyMethodToIgnore() { // 1. 创建依赖服务的Stub var mockService = MockRepository.GenerateStub<IExternalService>(); // 2. 预设调用MyMethodToIgnore时返回指定值,跳过真实逻辑 mockService.Stub(x => x.MyMethodToIgnore()) .Return("StubbedValue"); // 这里返回你需要的默认结果 // 3. 初始化被测试类 var target = new TargetClass(mockService); // 4. 执行测试方法 var result = target.MethodUnderTest(); // 5. 验证结果符合预期 Assert.AreEqual("Final: StubbedValue", result); }
这里的核心是用Stub预设方法返回值,这样真实的MyMethodToIgnore代码完全不会被执行,直接返回你指定的内容。
场景2:MyMethodToIgnore是被测试类自身的虚方法
如果MyMethodToIgnore是被测试类自己的方法,那它必须是虚方法(RhinoMocks只能拦截虚方法或接口方法),然后用PartialMock来部分模拟被测试类,拦截目标方法的调用。
示例代码结构:
public class TargetClass { public string MethodUnderTest() { var ignoredValue = MyMethodToIgnore(); return $"Final: {ignoredValue}"; } // 必须标记为virtual才能被拦截 protected virtual string MyMethodToIgnore() { // 这里是你想跳过的真实逻辑 return "RealValue"; } }
对应的测试代码:
[Test] public void MethodUnderTest_IgnoresInternalMyMethodToIgnore() { // 1. 创建被测试类的PartialMock(只拦截指定方法,其余逻辑正常执行) var mockTarget = MockRepository.GeneratePartialMock<TargetClass>(); // 2. 拦截自身的MyMethodToIgnore,返回预设值 mockTarget.Stub(x => x.MyMethodToIgnore()) .Return("StubbedInternalValue"); // 3. 执行测试方法 var result = mockTarget.MethodUnderTest(); // 4. 验证结果 Assert.AreEqual("Final: StubbedInternalValue", result); }
这种方式下,MethodUnderTest会正常执行,但内部调用的MyMethodToIgnore会被拦截,直接返回预设值,原方法的逻辑不会运行。
关键注意点
- 如果
MyMethodToIgnore是非虚实例方法或静态方法,RhinoMocks无法直接拦截,这种情况建议重构代码,把该方法提取到独立的依赖服务中(也就是场景1的模式),才能用Mock控制。 - 由于
MyMethodToIgnore有返回值,必须用Return()指定返回内容,不能用DoNothing()(DoNothing()仅适用于无返回值的void方法)。
内容的提问来源于stack exchange,提问作者user1699115
相关产品推荐
相关产品推荐

