加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

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

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

我对此的看法是,测试类在技术上违反了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;
}

现在我们做一个模拟:

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());
  }
}

实际上(IMHO)TestClass与DisplayMock的较高耦合比违反TestClass的SRP更为恶劣.此外,使用模拟框架,这个问题完全消失了.

编辑我刚刚在罗伯特C.马丁的优秀书籍Agile Principles,Patterns,and Practices in C#中简要提到了自我分流模式.以下是本书的摘要:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读