unit-testing - 执行 TDD 时要模拟哪些对象

标签 unit-testing tdd mocking

在创建方法时,是否应该将在该方法中实例化的每个对象都作为参数传入,以便可以在我们的单元测试中模拟这些对象?

我们这里有很多方法没有相关的单元测试和回顾性地编写测试;我们发现在这些方法中实例化了相当多的对象。

我们的选择之一是将我们当前的方法重构为更多类似单元的方法,并减少每个方法的职责数量。这可能是一个相当漫长的过程,但肯定会在 future 给我们带来很大的好处。

你怎么看?所有在方法中实例化的对象都应该作为参数传入吗?

最佳答案

也许不是所有的对象,但是你注入(inject)到你的单元中的对象越多,你的关注点分离就越好,所以我肯定会建议你朝着这个方向前进。

您不必将所有对象作为方法参数传递。通过构造函数注入(inject)将协作者注入(inject)类通常是更好的设计。这可以使您的界面保持干净,而您的实现可以导入它需要的协作者。

假设您的原始实现如下所示:

public class Foo
{
    public Ploeh DoStuff(Fnaah f)
    {
        var bar = new Bar();
        return bar.DoIt(f);
    }
}

这可以更改为如下所示:
public class Foo
{
    private readonly IBar bar;

    public Foo(IBar bar)
    {
        this.bar = bar;
    }

    public Ploeh DoStuff(Fnaah f)
    {
        return this.bar.DoIt(f);
    }
}

请注意,我更改了 bar从 Bar 的实例到 IBar 的实例,从而将 Foo 与 IBar 的具体实现解耦。这样的重构倾向于使您的单元测试更易于编写和维护,因为您现在可以独立地改变 Foo 和 Bar 的实现。

关于unit-testing - 执行 TDD 时要模拟哪些对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1661628/

相关文章:

java - 重构以编写 "pretty"JUnit 测试

ruby-on-rails - 如何将 CURL 命令映射到 Rails 中的单元测试

objective-c - 我如何在 OCMock 中模拟接受句柄作为参数的方法?

python - 以可模拟/可测试的方式连接文件

python - 测试 GUI 代码 : should I use a mocking library?

python - 如何在 Python 中向模拟函数提供条件参数?

unit-testing - 你在哪里设置 OrmLiteConfig.DialectProvider.NamingStrategy 在单元测试中?

unit-testing - 单元测试如何测试任何东西?

python - moto 没有 mock ec2?

android - org.mockito.exceptions.misusing.NotAMockException : Argument should be a mock, 但是是 : class java. lang.Class for Andriod SSLContext.getInstance() 方法