我有一个测试(代码如下)来测试Method1是否调用了Method2。 我得到的异常是:
当前代理生成器无法拦截指定的方法,原因是以下原因:- 密封方法无法拦截。
被测试的方法本身并不是sealed类型。 但是,它确实依赖于一个sealed类(一个第三方类,我很难创建包装器以正确模拟它 - 这是另一个问题的话题)。 无论如何,在这一点上,我没有要求FakeItEasy模拟密封类。 而在调试我的测试时,当依赖项被调用时,我可以清楚地看到一个真实的对象被生成,而不是假的。
然而,考虑到错误消息,我觉得它可能有些关联。
此外,我通过随机博客文章发现,将该方法设为虚方法可以解决问题,从而使测试通过。 我尝试了一下,它确实起作用了。 但我不明白为什么会这样,并且无论如何,保持该方法虚方法无意义。 在我的情况下,被测试的类没有自己的子类,即没有子类重写其方法,因此我看不到任何理由使它成为虚方法。
我错误地认为不必使该方法成为虚方法吗? FakeItEasy是否在尝试模拟密封类?
我真的不知道如何继续进行这个测试。
我的测试代码
[SetUp]
public void SetUp()
{
// Arrange
_service2 = A.Fake<Service2>(x => x.WithArgumentsForConstructor(
() => new Service2()));
_service1 = A.Fake<Service1>(x => x.WithArgumentsForConstructor(
() => new Service1(_service2)));
}
[Test]
public void when_Method1_executes_it_calls_Method2()
{
// Act
result = _service1.Method1();
// Assert
A.CallTo(() => _service2.Method2())
.WithAnyArguments()
.MustHaveHappened();
}
相关方法
public class Service1 : IService1
{
private readonly IService2 _service2;
public Service1(IService2 service2)
{
_service2 = service2;
}
public bool Method1()
{
using (var dependency = new MyDependency()) // third party sealed class
{
}
var x = _service2.Method2();
}
}
public class Service2 : IService2
{
public bool Method2() // making this virtual fixes the FakeItEasy exception
{
}
}
Service2
的类。当执行A.CallTo
时,它发现该方法无法被重写,因此FakeItEasy不能截取该调用。 - Blair Conrad