要模拟一个对象,它是否必须实现接口或标记为虚拟?

2023-11-24

或者该类也可以实现抽象类吗?


要模拟类型,它必须是一个接口(这也称为纯虚拟)或拥有虚拟成员(抽象成员也是虚拟的)。

根据这个定义,你可以模拟一切virtual.

本质上,动态模拟不要做任何你手工做不到的事情.

假设您正在针对这样的接口进行编程:

public interface IMyInterface
{
    string Foo(string s);
}

您可以手动创建 IMyInterface 的特定于测试的实现,该实现忽略输入参数并始终返回相同的输出:

public class MyClass : IMyInterface
{
    public string Foo(string s)
    {
        return "Bar";
    }
}

但是,如果您想测试消费者如何响应不同的返回值,那么这会变得非常快地重复,所以不要编写代码测试双打您可以手动让框架为您动态创建它们。

想象一下,动态模拟确实编写了与上面的 MyClass 实现类似的代码(它们实际上并不编写代码,而是动态发出类型,但这是一个足够准确的类比)。

以下是如何使用 Moq 定义与 MyClass 相同的行为:

var mock = new Mock<IMyInterface>();
mock.Setup(x => x.Foo(It.IsAny<string>())).Returns("Bar");

在这两种情况下,创建对象时都会调用所创建类的构造函数。由于接口没有构造函数,因此这通常是默认构造函数(分别是 MyClass 和动态发出的类的)。

您可以对具体类型执行相同的操作,例如:

public class MyBase
{
    public virtual string Ploeh()
    {
        return "Fnaah";
    }
}

手动,您将能够从 MyBase 派生并重写 Ploeh 方法,因为它是虚拟的:

public class TestSpecificChild : MyBase
{
    public override string Ploeh()
    {
        return "Ndøh";
    }
}

动态模拟库可以做同样的事情,抽象方法也是如此。

但是,您无法编写覆盖非虚拟或内部成员的代码,动态模拟也不能。他们只能做你手工能做的事情。

警告:上面的描述对于大多数动态模拟都是正确的,但 TypeMock 除外,它是不同的并且......可怕。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

要模拟一个对象,它是否必须实现接口或标记为虚拟? 的相关文章

随机推荐

  • 实体框架:Database.ExecuteSqlCommand 方法

    因此 我有一个在 MVC 4 应用程序中运行的基本更新语句 我这样称呼它 SQL Server 2008 R2 Entity Framework 5 0 var requestData requestInfo Database Execut
  • Android 小部件在一段时间后停止工作?

    我有一个带有小部件的手电筒应用程序 该小部件用于打开和关闭手电筒 不显示主要活动或任何内容 然而几个小时后 该小部件什么也没做 我的意思是 如果你点击它 什么也不会发生 我有两个classes来完成这个Provider and a Rece
  • 如何实现Fragment之间的水平滚动/滑动?

    我想在我的应用程序中实现类似 Pinterest 或 Trello 的导航 即导航 水平滚动的三个选项卡 我为此制作了一个自定义选项卡栏 因为我无法猜测如何使用导航选项卡模式更改操作栏中的选项卡宽度 所以我有三个按钮可以从一个片段导航到另一
  • Android Studio 2.3 更新导致 Robolectric 单元测试失败

    我所有的单元测试都开始抛出这个错误 No such manifest file build intermediates bundles debug AndroidManifest xml java lang NullPointerExcep
  • 使某些整数的异或为零所需的最小总和

    这是一个涉及算法和按位异或运算的问题 我们被给予x1 x2 x3 xn P 其中星号 运算表示 XOR 按位 运算 并且x1 至 xn 为正整数 P也是正整数 我们需要求最小值 a1 a2 a3 an 这样这个关系成立 gt x1 a1 x
  • 如何在 Excel 中使用 VBA 将附件添加到电子邮件

    我有以下代码 但它不起作用 我对 VBA 也很陌生 该代码可以填充电子邮件模板 但一旦我添加 Attachment Add 它就不起作用 Sub CreateMail Dim objOutlook As Object Dim objMail
  • Pyautogui 在游戏窗口中不起作用

    我正在使用 Pyautogui 对游戏进行一些测试 但在那些改变光标的游戏和全屏游戏中 这些方法都不起作用 我现在正在尝试 仙境传说 Online I tried pyautogui click pyautogui moveTo x y t
  • Visual Studio 在线迁移(VSO 到 VSO)- 不仅仅是代码

    类似的问题Visual Studio 在线迁移 VSO 到 VSO 然而 我们寻求的不仅仅是源代码迁移 我们想要获取一切 代码 工作项目 包括链接 测试计划 测试结果 整个东西 有没有人这样做过 是否可能 或者甚至得到更好的支持 Micro
  • SQL 中的 CHAR 数据类型是否已过时?你什么时候使用它?

    标题几乎概括了问题 我已经很多年没有使用过 CHAR 了 现在 我正在对一个充满 CHAR 的数据库进行逆向工程 用于主键 代码等 CHAR 30 列怎么样 编辑 因此 普遍的观点似乎是 CHAR 对于某些事情来说完全没问题 然而 我认为您
  • 分叉具有超时和捕获输出的子进程

    假设我有一个如下所示的函数 如何捕获 Process spawn 调用的输出 如果进程花费的时间超过指定的超时时间 我还应该能够终止该进程 请注意 该函数还必须是跨平台的 Windows Linux def execute with tim
  • 并排排列 3 个 UIButtons(等宽)

    如何并排排列 3 个 UIButton 我正在使用自动布局 我的要求是 1 无论设备如何 它们都应该具有相同的宽度 2 从视图的开始到结束垂直占据 我尝试了不同的方法 但未能实现这一目标 是否可以通过界面生成器 有两种方法可以做到这一点 W
  • CSS 选择第二级元素

    如何删除第二级背景li元素 ul class navi li a href Test a li li class current a href Test a ul class navi2 li class current a href Re
  • 使用 WooCommerce ajax 更新购物车

    在我的 woocommerce 网站中 我更改了购物车页面 删除了 更新购物车 按钮 并创建了 2 个按钮来添加和删除产品项目 如下图所示 当我单击数量按钮时 如果我按下按钮更新购物车 我想调用相同的函数 为此 我使用ajax 但它没有做任
  • 如何使用 pyparsing 解析缩进和缩进?

    下面是 Python 语法的一个子集 single input NEWLINE simple stmt compound stmt NEWLINE stmt simple stmt compound stmt simple stmt sma
  • Rails 与 activerecord 共享会话

    我目前使用默认 cookie 作为单点登录 SSO 但在我推送更新后 一些用户遇到了奇怪的错误 我正在考虑转移到活动记录来存储会话 但想知道如何告诉 Rails 会话位于另一个数据库中 因此 如果我通过 AR 将会话存储在 App1DB 中
  • 为什么成员函数可以在临时函数上调用而全局函数却不能?

    在下面的代码中我调用step作为成员函数和临时值上的全局函数 成员函数是允许的并且可以工作 而全局函数是不允许的 因为invalid initialisation of non const reference of type kludge
  • 使用 Jackson 合并两个 JSON 文档

    是否可以使用 Jackson JSON 库合并两个 JSON 文档 我基本上使用 Jackson 映射器和简单的 Java 地图 我试图在谷歌和杰克逊的文档中搜索 但找不到任何东西 受到 StaxMans 答案的启发 我实现了这种合并方法
  • OkHttpClient v2.0 中缺少“open”方法

    如果您从 OkHttp 库从 1 x 升级到 2 x 则明显缺少 OkHttpClient 方法 open 下面的代码将无法编译 OkHttpClient client new OkHttpClient HttpURLConnection
  • 防止形状可绘制笔画部分重叠

    有什么办法可以防止部分重叠stroke on the shape drawable 我更喜欢将笔划完全重叠在形状的边界上 这是我的 xml
  • 要模拟一个对象,它是否必须实现接口或标记为虚拟?

    或者该类也可以实现抽象类吗 要模拟类型 它必须是一个接口 这也称为纯虚拟 或拥有虚拟成员 抽象成员也是虚拟的 根据这个定义 你可以模拟一切virtual 本质上 动态模拟不要做任何你手工做不到的事情 假设您正在针对这样的接口进行编程 pub