CSharp - 在 VB ) 中,成员在非虚拟状态上设置无效( 重写?

  显示原文与译文双语对照的内容
120 2

我有一个 单元测试,我必须模拟返回布尔类型的非虚方法

public class XmlCupboardAccess
{
 public bool IsDataEntityInXmlCupboard(string dataId,
 out string nameInCupboard,
 out string refTypeInCupboard,
 string nameTemplate = null)
 {
 return IsDataEntityInXmlCupboard(_theDb, dataId, out nameInCupboard, out refTypeInCupboard, nameTemplate);
 }
}

我有 XmlCupboardAccess 类的模拟对象,我正在尝试在我的测试用例中设置这个方法的模拟,如下所示

[TestMethod]
Public void Test()
{
 private string temp1;
 private string temp2;
 private Mock<XmlCupboardAccess> _xmlCupboardAccess = new Mock<XmlCupboardAccess>();
 _xmlCupboardAccess.Setup(x => x.IsDataEntityInXmlCupboard(It.IsAny<string>(), out temp1, out temp2, It.IsAny<string>())).Returns(false); 
//exception is thrown by this line of code
}

但该行引发异常

Invalid setup on a non-virtual (overridable in VB) member: 
x => x.IsDataEntityInXmlCupboard(It.IsAny<String>(),. temp1,. temp2, 
It.IsAny<String>())

关于如何绕过这里异常的建议?

时间:原作者:0个回答

65 1

最小值不能模仿非虚方法和密封类。在使用模拟对象运行测试时,minimum实际上创建了内存代理类型,它继承了你的"xmlcupboardaccess",并覆盖了你在"设置"方法中设置的行为。如你在 C# 中所知道的,只有在它被标记为虚拟的情况下,才能重写某些内容。Java假设默认情况下每个非静态方法都是虚拟的。

我认为你应该考虑的另一个事情是为"cupboardaccess"引入一个接口,并开始模拟接口。它将帮助你分离代码,并在长期运行中有好处。

最后,还有一些框架:IL直接工作,因此可以模拟非虚方法的TypeMockJustMock 。然而,它们都是商业产品。

原作者:
...