【发布时间】:2010-11-21 13:44:22
【问题描述】:
从 Ruby 世界回来后,我在 Java 中进行 TDD 时遇到了一些问题。最大的问题是当我的应用程序只是与外部 API 通信时。
假设我只想从 Google 日历中获取一些数据,或者从某个 Twitter 用户那里获取 5 条推文并显示出来。
在 Ruby 中,我没有任何问题,因为我可以直接在测试中对 API 库进行猴子补丁,但在 Java 中我没有这样的选择。
如果我从 MVC 的角度考虑这一点,我的模型对象是通过某个库直接访问 API。问题是,这是糟糕的设计吗?我是否应该始终将任何 API 库包装在某个接口中,以便可以在 Java 中模拟/存根它?
因为当我想到这一点时,该界面的唯一目的是模拟(请不要因为这样说而杀了我)猴子补丁。这意味着每当我使用任何外部资源时,我都必须将每一层包装在可以被存根的接口中。
# do I have to abstract everything just to do this in Java?
Twitter.stub!(:search)
现在你可能会说我应该总是抽象出接口,这样我就可以将底层更改为其他任何东西。但如果我在写 twitter 应用程序,我不会将其更改为 RSS 阅读器。
是的,我可以添加例如 Facebook,然后有界面是有意义的。但是当没有其他资源可以替代我正在使用的资源时,我仍然必须将所有内容包装在接口中以使其可测试。
我是否遗漏了什么,或者这只是在 Java 世界中进行测试的一种方式?
【问题讨论】:
标签: java ruby testing junit rspec