当我最初被介绍给Mocks时,我觉得主要目的是模拟来自外部数据源的对象。这样,我不必维护自动化的单元测试测试数据库,我可以伪造它。
但是现在我开始以不同的方式思考它。我想知道Mocks是否可以更有效地将测试方法与自身之外的任何事物完全隔离。不断浮现的图像是绘画时使用的背景。您想防止涂料泛滥成灾。我只是在测试该方法,我只想知道它对这些伪造的外部因素有何反应?
用这种方法执行此操作似乎非常繁琐,但是我看到的好处是,测试失败时,它是因为它被拧紧了,而不是向下拧了16层。但是现在我必须进行16个测试才能获得相同的测试覆盖率,因为每个测试都将单独进行测试。另外,每个测试变得更加复杂,并且与所测试的方法更加紧密地联系在一起。
这对我来说感觉不错,但它看起来也很残酷,所以我有点想知道别人的想法。
最佳答案
我建议您看一下马丁·福勒(Martin Fowler)的文章Mocks Aren't Stubs,该书对Mocks的权威性超过了我的能力。
模拟的目的是在不依赖依赖项的情况下对代码进行单元测试,以便您可以在“单元”级别上真正地测试一段代码。被测试的代码是真实的交易,它所依赖的所有其他代码段(通过参数或依赖项注入(inject)等)都是“模拟”(空实现,在调用其方法之一时始终返回期望值)。
起初,模拟似乎很乏味,但是一旦掌握了使用技巧,它们就会使单元测试变得更加轻松和强大。大多数语言都具有Mock库,这使得 mock 变得相对琐碎。如果您使用的是Java,我将推荐我的个人收藏夹:EasyMock.
让我结束这个想法:您也需要集成测试,但是进行大量的单元测试可以帮助您找出存在缺陷的组件。
关于unit-testing - 如何使用Mocks?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59195/