自分流测试模式是否违反单一责任原则?

Jav*_*mae 5 oop unit-testing design-patterns

多年来我几次使用自分流单元测试模式.正如我最近向某人解释的那样,他们认为它违反了SRP.参数是现在可以出于以下两个原因之一更改测试类:测试更改时,或者测试正在实现的接口上的方法签名发生更改时.在考虑了一段时间后,似乎这是一个正确的评估,但我想得到其他人的意见.思考?

参考:http: //www.objectmentor.com/resources/articles/SelfShunPtrn.pdf

Igo*_*aka 5

我对此的看法是,测试类在技术上违反了SRP,但它并没有违反SRP的精神.自我分流的替代方法是将一个模拟类与测试类分开.

使用单独的模拟类,您可能会认为它全部是自包含的并且满足SRP,但是与模拟类的属性的语义耦合仍然存在.所以,实际上,我们没有实现任何有意义的分离.

以PDF为例:

public class ScannerTest extends TestCase implements Display
{
  public ScannerTest (String name) {
    super (name);
  }
  public void testScan () {
    // pass self as a display
    Scanner scanner = new Scanner (this);
    // scan calls displayItem on its display
    scanner.scan ();
    assertEquals (new Item (“Cornflakes”), lastItem);
  }
  // impl. of Display.displayItem ()
  void displayItem (Item item) {
    lastItem = item;
  }
  private Item lastItem;
}
Run Code Online (Sandbox Code Playgroud)

现在我们做一个模拟:

public class DisplayMock implements Display
{
  // impl. of Display.displayItem ()
  void displayItem (Item item) {
    lastItem = item;
  }

  public Item getItem() {
     return lastItem;
  }
  private Item lastItem;
}

public class ScannerTest extends TestCase
{
  public ScannerTest (String name) {
    super (name);
  }
  public void testScan () {
    // pass self as a display
    DisplayMock dispMock = new DisplayMock();
    Scanner scanner = new Scanner (dispMock );
    // scan calls displayItem on its display
    scanner.scan ();
    assertEquals (new Item (“Cornflakes”), dispMock.GetItem());
  }
}
Run Code Online (Sandbox Code Playgroud)

在实际应用中(IMHO)的较高的耦合TestClassDisplayMock比所述违反SRP为更大的恶TestClass.此外,使用模拟框架,这个问题完全消失了.

编辑我刚刚在罗伯特C.马丁的优秀着作" 敏捷原理,模式和C#实践"中简要提到了自我分流模式.这是本书的摘录:

替代文字

因此,创造SRP的人(在同一本书中详细讨论过)并没有使用自分流模式的疑虑.鉴于此,我会说在使用这种模式时你对OOP(Objected Orientated Police)非常安全.