为嵌套对象生成单元测试用例的测试数据

时间:2012-09-24 16:02:41

标签: java mocking mockito

在为任何企业级java服务编写单元测试用例时,模拟依赖服务时,我发现为单元测试用例设置数据是一件非常痛苦的事。大多数情况下,这是开发人员不编写单元测试用例而非编写集成样式测试用例的最有说服力的理由。如果服务依赖于其他几个服务(取决于它们各自的DAO)和它自己的DAO,那么为合理嵌套的对象生成when-thenReturn子句就变得相当费力了,并且开发人员看起来正在服用简单的路由和加载整个spring上下文并从直接源获取数据,这些数据可能并不总是提供可以遍历所有必需代码路径的数据。在此背景下,我的一位同事建议,为什么不运行样本集成测试,并使用方面,捕获所有相关数据点并将其序列化为XML表示,该表示可用于实现单元测试的测试数据案例。令我们惊喜的是,我们找到了一个名为TestDataCaptureJ on github的框架,它与此非常相似。它使用方面来捕获数据点,并生成java代码来创建对象。

该网站上陈述的motivation似乎非常贴切,我想知道是否还有其他替代品可以提供相似的功能。而且,如果专家可以批评这种整体方法,那将是很好的。

此外,该项目大约2岁,有一些我们不得不修复的bug,并希望将它作为一个mavenized github fork回来。只需检查以确保其中一个着名的马厩也没有其他类似的倡议。

提前致谢!

1 个答案:

答案 0 :(得分:9)

我对这种方法有两个批评 ...请记住,我对你的背景知识几乎为零,这意味着我在这里建议的内容可能不适合你。

我只遇到过你提到过的问题,这是一个症状,即对象之间的耦合太多,因为责任是方式到宽泛。从那时起,我使用Domain-Driven Design方法,我没有再遇到这个问题。

我更喜欢使用Test-Data Builders来创建测试数据。这种方法允许我有一个我想要构建的模板,只需替换我对测试感兴趣的位。如果您决定采用这种方式,我强烈建议您使用名为Make-It-Easy的小型库,以简化这些构建器的创建。

还有两个建议

如果你有时间,我建议你

  1. 观看Michael Feathers所谓的The Deep Synergy Between Testability and Good Design预设 - 部分讲话与你所遇到的非常相似。
  2. 阅读书籍Growing Object-Orieted Systems, Guided by Tests(又名GOOS),它有关于如何编写简单,令人惊叹,可测试代码的各种见解。