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
相关产品推荐
相关产品推荐

