在我的系统中模拟/测试核心对象

时间:2009-10-06 12:52:33

标签: java unit-testing mocking

我被要求改变一些对我们工作的系统来说是核心的类。有问题的类每个都需要5-10个不同的相关对象,这些对象本身需要相同数量的对象。

数据也从几个数据源中提取,项目使用EJB2,因此在测试时,我运行时没有容器来引入我需要的依赖项!

我开始对这项任务感到不知所措。我已经尝试过使用JUnit和Easymock进行单元测试,但是只要我模拟或存根一件事,我发现它需要更多。所有东西似乎都是紧密耦合的,这样我就可以使用我的存根达到3或4级,以防止NullPointerExceptions。

通常使用这种类型的任务,我只需要进行更改和测试。但最短的构建周期大约是10分钟,我喜欢在执行之间进行非常短的迭代编码(可能是因为我对编写完美代码的能力不太自信)。

任何人都知道一个好的策略/工作流程来摆脱这个泥潭?

3 个答案:

答案 0 :(得分:5)

正如您所说,听起来您的主要问题是您正在使用的API过于紧密耦合。如果您能够修改API,那么隐藏接口后面的直接依赖关系会非常有帮助,这样您就可以立即依赖切断依赖关系图。

如果无法做到这一点,自动模拟容器可能会有所帮助。这基本上是一个容器,它自动指出如何返回嵌套抽象的具有良好默认行为的模拟。当我在.NET框架上工作时,我不推荐任何Java。

如果您想了解单元测试模式和最佳做法,我只能推荐xUnit Test Patterns

对于解耦紧耦合代码的策略,我建议Working Effectively with Legacy Code

答案 1 :(得分:1)

我要做的第一件事就是缩短构建周期。也许添加选项只构建和测试当前正在开发的组件。

接下来,我将介绍通过在每个组件之间引入接口来解耦一些依赖关系。我还想使用依赖注入最有可能将耦合移出。如果我不能去DI,我会有两个ctors,使用服务定位器(或者你有什么)和一个可注射的ctor。

  

项目使用EJB2所以在测试时,我正在运行而没有容器来引入我需要的依赖项!

这是不是意味着与?我会尽可能多地研究POJO,以便可以在不需要知道任何EJB-y的情况下进行测试。

答案 2 :(得分:1)

如果你的项目可以用Java 1.5编译,你应该看看JMock?使用此框架的2. *版本,事情可以很快得到存根。

1. *版本将与1.3+ Java编译器一起使用,但模拟更加冗长,所以我不推荐它。

至于策略,我给你的建议是接受接口。即使您具有给定接口的单个​​实现,也始终创建接口。它们可以非常容易地进行模拟,并且可以在测试代码时更好地解耦。