Unit testing 我是否应该为每个类创建一个接口以使代码可测试(单元测试)

Unit testing 我是否应该为每个类创建一个接口以使代码可测试(单元测试),unit-testing,testing,interface,Unit Testing,Testing,Interface,我试图学习如何创建有价值的单元测试。 在每个教程中,我看到人们为每个依赖项创建接口来创建模拟 这是否意味着我应该始终为我项目中的每个类创建一个接口?我不知道这是个好主意还是个坏主意,但每次我看到一条“总是”的规则时,我都会产生怀疑 我应该总是为我项目中的每个类创建一个接口 没有 没有一条规则可以让您遵循,也没有一件事情可以让您的所有代码自动进行单元测试。您可以做的是编写具有可抽象依赖项的代码。如果您想测试您编写的代码是否易于进行单元测试,请尝试为其编写单元测试。如果一个依赖项挡住了你的路,你就有

我试图学习如何创建有价值的单元测试。 在每个教程中,我看到人们为每个依赖项创建接口来创建模拟

这是否意味着我应该始终为我项目中的每个类创建一个接口?我不知道这是个好主意还是个坏主意,但每次我看到一条“总是”的规则时,我都会产生怀疑

我应该总是为我项目中的每个类创建一个接口

没有

没有一条规则可以让您遵循,也没有一件事情可以让您的所有代码自动进行单元测试。您可以做的是编写具有可抽象依赖项的代码。如果您想测试您编写的代码是否易于进行单元测试,请尝试为其编写单元测试。如果一个依赖项挡住了你的路,你就有一个耦合的依赖项。抽象它

你如何抽象它取决于你自己。您可以使用多种工具:

  • 接口
  • 抽象类
  • 包含大量
    虚拟
    成员的具体类
  • 可模拟的直通包装类(对于不可单元测试的第三方依赖非常有用)
  • 等等
  • 您还可以通过多种方式将依赖关系引入到使用它的代码中:

  • 构造函数注入
  • 属性注入
  • 将其作为参数传递给方法
  • 工厂
  • 在某些情况下,服务定位器(例如,在将依赖项抽象引入遗留代码库时很有用)
  • 等等
  • 如何构造代码实际上取决于所构建的内容以及对这些对象有意义的内容。对于与外部系统集成的服务类来说,接口非常有意义。对于具有多种共享功能的潜在实现的域模型,抽象类可能非常有意义。有许多潜在用途的可能性

    测试代码是否可进行单元测试的真正试金石不是“我是否使用接口?”,而是“我可以为此编写一个有意义的单元测试吗?”如果功能是可隔离的,而不依赖于依赖项(通过不使用依赖项或允许模拟依赖项进行测试),那么对我来说,它似乎是相当可进行单元测试的

    我应该总是为我项目中的每个类创建一个接口

    没有

    没有一条规则可以让您遵循,也没有一件事情可以让您的所有代码自动进行单元测试。您可以做的是编写具有可抽象依赖项的代码。如果您想测试您编写的代码是否易于进行单元测试,请尝试为其编写单元测试。如果一个依赖项挡住了你的路,你就有一个耦合的依赖项。抽象它

    你如何抽象它取决于你自己。您可以使用多种工具:

  • 接口
  • 抽象类
  • 包含大量
    虚拟
    成员的具体类
  • 可模拟的直通包装类(对于不可单元测试的第三方依赖非常有用)
  • 等等
  • 您还可以通过多种方式将依赖关系引入到使用它的代码中:

  • 构造函数注入
  • 属性注入
  • 将其作为参数传递给方法
  • 工厂
  • 在某些情况下,服务定位器(例如,在将依赖项抽象引入遗留代码库时很有用)
  • 等等
  • 如何构造代码实际上取决于所构建的内容以及对这些对象有意义的内容。对于与外部系统集成的服务类来说,接口非常有意义。对于具有多种共享功能的潜在实现的域模型,抽象类可能非常有意义。有许多潜在用途的可能性


    测试代码是否可进行单元测试的真正试金石不是“我是否使用接口?”,而是“我可以为此编写一个有意义的单元测试吗?”如果功能是可隔离的,而不依赖于依赖项(通过不使用依赖项或允许模拟依赖项进行测试),那么对我来说,它似乎是相当可进行单元测试的。

    YAGNI。你不会需要它的。针对当前的问题,做你需要做的。如果需要,您可以随时在以后添加接口。顺便说一句,您不需要接口来使代码可测试。这是一个非常有效的问题。也许有多个答案是可能的,然后把它们放在下面并投票表决。你似乎正在阅读10年或更长时间前的教程,当时模拟框架只能模拟接口。现在已经不是这样了,而且有很长一段时间。@JBNizet如果我想模拟一个类,那么我需要生成我想要模拟的方法virtual@user4230877:两者都是,这取决于你正在做什么,以及它需要如何与你正在构建的其他一切协同工作。我们怎么强调都不过分。。。没有一种正确的方法可以编写所有可能的代码。你不会需要它的。针对当前的问题,做你需要做的。如果需要,您可以随时在以后添加接口。顺便说一句,您不需要接口来使代码可测试。这是一个非常有效的问题。也许有多个答案是可能的,然后把它们放在下面并投票表决。你似乎正在阅读10年或更长时间前的教程,当时模拟框架只能模拟接口。现在已经不是这样了,而且有很长一段时间。@JBNizet如果我想模拟一个类,那么我需要生成我想要模拟的方法virtual@user4230877:两者都是,这取决于你正在做什么,以及它需要如何与你正在构建的其他一切协同工作。我们怎么强调都不过分。。。没有一种正确的方法可以编写所有可能的代码。