You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FakeItEasy:调用方为受保护重写方法时无法检测受保护方法调用

问题原因分析

  • 方案1失败原因:FakeItEasy创建ImplementingClass的伪造对象时,默认会重写所有虚/抽象成员,替换为空实现。你代码中的Do_Override是重写的抽象方法,被伪造逻辑替换后不会执行你原本写的调用ProtectedDo的逻辑,所以方法调用没有触发,校验失败。
  • 方案2失败原因:你使用Wrapping包裹真实实例,但基类的Do是非虚方法,FakeItEasy无法拦截非虚方法的执行逻辑。调用sutFakeWrapper.Do()时,方法内部的Do_Override和ProtectedDo都是直接调用你传入的真实实例的内部方法,没有走伪造代理的拦截逻辑,所以伪造对象无法记录到ProtectedDo的调用,校验失败。

正确解决方案

你只需要显式配置伪造对象的Do_Override方法调用基类的原始实现即可,修改后的测试代码如下:

public class ImplementingClassShould
{
    [Fact]
    public void Run_ProtectedDo()
    {
        var fake = A.Fake<ImplementingClass>();
        // 配置Do_Override调用基类原实现
        A.CallTo(fake).Where(_ => _.Method.Name == "Do_Override")
            .CallsBaseMethod();
        
        fake.Do();
        
        A.CallTo(fake).Where(_ => _.Method.Name == "ProtectedDo")
            .MustHaveHappened();
    }
}

这个方案执行时,Do方法调用Do_Override会走你写的原有逻辑,触发ProtectedDo调用,且该调用会被伪造代理拦截到,校验可以正常通过。

内容的提问来源于stack exchange,提问作者cdi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 16:45:05