unit-testing - 如何单元测试实例创建?

标签 unit-testing dependency-injection

我有一个 Carpenter使用 Lathe 完成工作的类和 Wood目的。

class Carpenter
{
    function Work()
    {
        $tool = new Lathe();
        $material = new Wood();
        $tool->Apply($material);
    }
}
Lathe依赖于一个名为 Material 的接口(interface),所以我可以轻松地进行单元测试 Lathe给它一个假的Material在我的单元测试中。 Wood不依赖任何东西,所以也可以很容易地测试。
interface Material {
    // Various methods...
}

interface Tool {
    function Apply(Material $m);
}

class Wood implements Material  {
    // Implementations of Material methods
}

class Lathe {
    function Apply(Material $m) {
        // Do processing
    }
}

但是,Carpenter取决于具体的类 LatheWood因为它必须创建它们的实例。这意味着就目前而言,我无法对 Work() 进行单元测试。不会无意中带入 Lathe 的方法和 Wood正在测试中。

我应该如何将我的设计更改为单元测试 Carpenter ?

最佳答案

您可以在这里采取几个不同的方向:

  • 使用构造函数注入(inject) 并简单地将工具和 Material 实例注入(inject)木匠。
  • 如果由于某种原因注入(inject)实例不起作用(可能是因为您需要为每次调用 Work 方法创建新实例),您可以注入(inject) 抽象工厂 反而。
  • 您也可以使用 工厂方法 ctford 描述的方法,但这需要您还创建特定于测试的覆盖才能进行单元测试,虽然这是完全有效的事情,但它只是更多的工作,而且在许多情况下,其他替代方案更好、更灵活。
  • 关于unit-testing - 如何单元测试实例创建?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1900358/

    相关文章:

    objective-c - 使用 OCMock 模拟 KVO

    ios - Swift:使用 NSNotificationCenter 进行测试

    java - Guice 将对象注入(inject)到类构造函数中

    c# - 根据配置值在 Autofac 中有条件地应用通用装饰器

    angular - RouteReuseStrategy 中的依赖

    unit-testing - 所有单元测试都将Moq抛出BadImageFormatException吗?

    .net - Visual Studio 2012 中的私有(private)访问器

    c# - 使用测试服务器的 .NET 6 E2E 测试在 TeamCity CI 上失败,但工作手动运行

    c# - 通过 IOptions 配置 EF Core 上下文

    dependency-injection - 如何为 Symfony2 Controller 实现基类