单元测试 – 自分流测试模式是否违反单一责任原则?
发布时间:2020-12-13 20:45:46 所属栏目:百科 来源:网络整理
导读:多年来我几次使用自分流单元测试模式.正如我最近向某人解释的那样,他们认为它违反了SRP.参数是现在可以出于以下两个原因之一更改测试类:测试更改时,或者测试正在实现的接口上的方法签名发生更改时.在考虑了一段时间后,似乎这是一个正确的评估,但我想得到其
多年来我几次使用自分流单元测试模式.正如我最近向某人解释的那样,他们认为它违反了SRP.参数是现在可以出于以下两个原因之一更改测试类:测试更改时,或者测试正在实现的接口上的方法签名发生更改时.在考虑了一段时间后,似乎这是一个正确的评估,但我想得到其他人的意见.思考?
参考:
我对此的看法是,测试类在技术上违反了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)非常安全. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |