当前位置: 首页 > 知识库问答 >
问题:

为什么我会得到一个异常,消息是“非虚拟(在VB中可重写)成员上的设置无效...”?

杨安歌
2023-03-14

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

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);
    }
}
[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>())

共有1个答案

林魁
2023-03-14

Moq不能模拟非虚方法和密封类。在使用mock对象运行测试时,MOQ实际上会创建一个内存中的代理类型,它继承自“XMLCupBoardAccess”,并重写在“Setup”方法中设置的行为。正如您所知,在C#中,只有当某个东西被标记为virtual时,您才能重写它,而Java却不是这样。默认情况下,Java假定每个非静态方法都是虚拟的。

我认为您应该考虑的另一件事是为您的“CupBoardAccess”引入一个接口,并开始模仿该接口。它将帮助您解耦代码,并从长远来看有好处。

最后,还有一些框架,如:TypeMock和JustMock直接与IL一起工作,因此可以模拟非虚方法。然而,两者都是商业产品。

 类似资料:
  • 请问为什么第13行的错误是未报告的异常,必须捕获pr声明要抛出

  • 我收到一个非法监视器异常。我在谷歌上搜索了一下,但没有什么能说明我做错了什么。 从这个normalclass中,我为其他类创建了一个对象,并将该对象交给thread和同步thread。为什么我会得到这个例外?

  • 我有一个启动屏幕,它运行一个从API下载数据的。在该任务的上,我运行下一个来发送存储的电子邮件。完成后,我需要一个弹出一个ok按钮,以便用户知道下载完成。我使用了这个SO问题来尽我所能: AsyncTask内部的Android AlertDialog 现在,当我尝试向对话框添加属性时,我得到一个NullPointerException: <code>生成器上出现错误。setTitle(“销售工具包

  • 我用RSA算法加密和解密。当我加密一个字符串时,它工作正常。当我解密时,我得到一个错误。下面,我发布我的代码。

  • 像这样 org.eclipse.core.runtime.coreException:无法在org.eclipse.m2e.core.internal.embedder.mavenimpl.readModel(mavenimpl.java:565)在org.eclipse.m2e.core.internal.embedder.mavenimpl.readModel(mavenimpl.java:5

  • 问题内容: 我刚刚尝试了Jasper Report,我正在关注此站点的教程 我也下载了示例源,然后运行它,没有错误。但是,当我使用创建自己的报告时,请对其进行编译,然后将文件添加到我的项目中。还有,当我运行我的程序: 这是我用于显示报告的按钮操作(这只是示例,报告仅包含一个带有参数的文本:outputText): 如果有问题,我已经将所有需要的jar导入到我的项目中,当我使用该教程中的文件时没有问