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

如何对公共方法进行单元测试,该方法在内部调用许多已经单独进行单元测试的内部或私有方法

柯轶
2023-03-14

在我们的ASP。Net核心应用程序,我们有许多API从服务类调用公共方法。

服务类正在实现一个接口。

每个服务方法(取决于复杂性和需求)可以调用任意数量的内部或私有或辅助方法。

虽然这些内部/私有/或辅助方法中的每一个都单独进行单元测试,但我们如何以这样一种方式测试公共服务方法,即我们不必重复已经在测试内部/私有/辅助方法中花费的代码/精力?

e、 我们可以很容易地模拟接口方法,说接口方法需要这些输入参数并返回bla bla(实际上不调用该方法)。那么,可以对不属于接口的内部/私有/辅助方法做类似的事情吗?这样我们就不必实时调用这些方法,并且可以在测试主方法本身时“模拟”它们?

共有1个答案

鲁阳焱
2023-03-14

实际上,如果内部/私有方法是虚拟的,则可以对其进行模拟。

例如,拥有如下类:

public class ClassUnderTest
{
  public void MethodUnderTest() {
    SubMethod();   
  }

  protected virtual void SubMethod() {
  }
}

您可以模拟它并使用以下工具进行测试:

var classMock = new Mock<ClassUnderTest>();
classMock.Setup(x => x.SubMethod());
var class = classMock.Object;

class.MethodUnderTest();
classMock.Verify(x => x.SubMethod(), Times.Once);

尽管如此,这实际上并不是一个好方法。通常,如果您需要测试此类场景,这意味着您的方法测试和类测试实际上可以作为其他函数的协调器,并且将方法(从方法测试中调用)从其他类中提取出来以保持体系结构的稳定性是有一定意义的ClassUnderTest将执行编排,而其他类将执行编排。

顺便说一句。另一个不好的事情是,如果您将内部方法标记为受保护的虚拟只是为了能够模拟它们,这有点违反了单元测试的想法,在单元测试中,您不应该添加任何特殊代码来使其可测试。

 类似资料:
  • 我有一个类,它有一个公共方法,它调用另一个私有方法。 通过调用公共方法 并将 设置为 来进行测试。 将更改为package-private并在测试中直接调用它。 然而,我不确定哪种方法更好。

  • 我需要一些软件测试方面的指导。 我把事情复杂化了,但我太专注了,看不到我做错了什么,也看不到其他做事方式。 我有几个公共方法使用相同的私有方法。 私有方法本身: 必须为其特定角色处理许多场景 假设私有方法需要5个测试来覆盖所有场景,并由6个公共方法使用。 问题 > 然后我是否需要至少5x6个测试? 如何对每个公共方法重复使用私有方法的测试? 有没有关于重构重复测试的示例/文章? 示例 OnStar

  • 以下是设置: 我需要测试公共方法,以检查是否筛选了invalidObjects。如您所见,它将传递给私有的方法。该方法过滤掉无效的对象,并将有效的对象发送给web服务方法。该web服务方法不返回任何内容。因此,我不知道是否只有有效的对象被发送到web服务方法。你建议我怎么做才能检验这个案子?我正在使用Mockito框架来模拟对象。

  • 我陷入了单元测试场景的一个基本问题,并将感谢帮助。 我有一个类,它调用在DB中将标志设置为true。 我的测试: 我被要求测试并检查是否正在使用相关数据调用。 由于返回类型无效,我如何测试它?

  • 本文向大家介绍对 Vue-Router 进行单元测试的方法,包括了对 Vue-Router 进行单元测试的方法的使用技巧和注意事项,需要的朋友参考一下 由于路由通常会把多个组件牵扯到一起操作,所以一般对其的测试都在 端到端/集成 阶段进行,处于测试金字塔的上层。不过,做一些路由的单元测试还是大有益处的。 对于与路由交互的组件,有两种测试方式: 使用一个真正的 router 实例 mock 掉 $r

  • 我有一个触发器,当opportunity更新时触发,作为其中的一部分,我需要调用我们的API,并提供opportunity的一些详细信息。 根据Web上的许多建议,我创建了一个类,其中包含一个@Future方法来制作标注。 我试图捕获在@future方法中抛出的异常,但测试方法没有看到它。 测试中的类如下所示: 下面是单元测试: 现在,我已经读到,测试@future方法的方法是用测试来围绕调用。s