【问题标题】:Mocking dependencies of a class which uses static factory模拟使用静态工厂的类的依赖项
【发布时间】:2013-07-28 16:03:50
【问题描述】:

对于单元测试,我如何模拟使用工厂的类的依赖关系。

例如,如果我有以下课程:

public class SignalProcessor
{
  ISignalFilter signalFilter;

  public SignalProcessor()
  {
     this.signalFilter = SignalFilterFactory.GetInstance();
  }
}

现在在 SignalProcessor 的单元测试中,我想模拟 ISignalFilter,即使用 ISignalFilter 的测试版本。如果我使用依赖注入而不是工厂,那么我可以将 TestSignalFilter 传递给 SignalProcessor 构造函数。但是如何在工厂案例中模拟 ISignalFilter?

【问题讨论】:

  • 您应该考虑使用像 Castle 或 Unity 这样的 DI 框架(如果您还没有使用)。这些框架提供了将工厂外部化为 XML 或类(其本身可以进行单元测试)的工具。那么你可能只有一个构造函数“public SignalProcessor(ISignalFilter filter)”。

标签: unit-testing mocking factory


【解决方案1】:

注入依赖:

public class SignalProcessor
{
  ISignalFilter signalFilter;

  public SignalProcessor() : this(SignalFilterFactory.GetInstance()) {}

  public SignalProcessor(ISignalFilter filter)
  {
     this.signalFilter = filter;
  }
}

【讨论】:

  • 很有趣,因此您正在添加一个新的公共构造函数,它允许依赖注入,仅用于单元测试目的。不一定是坏事,但还有其他想法吗?
  • 当然,还有很多其他的想法。这是迄今为止最好的一个。大多数其他想法都是“在某处创建状态然后将其用于测试目的”的变体,这为通往地狱铺平了道路。
  • 我什至会摆脱默认构造函数。只需提供具有 ISignalFilter 参数的版本即可。那么 signalProcessor 类对 SignalFilterFactory 没有依赖。它不关心 ISignalFilter 是如何创建的——这是调用者的责任。
  • 同意@GarethOwen。如果我们走这条路,我也不会使用静态工厂。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多