2011-12-23 84 views
1

在EJB 3.1的单元测试中模拟容器服务有什么优势?单元测试EJB 3.1 - 为什么模拟容器服务

的可能答案,我是说我想它是,

  1. 它提高了测试的性能。
  2. 它不遵守单元测试的规则,因为与其他API有很多交互。 (请提供您的意见)

除了这些,你认为还有其他的优点吗?可以测试一些由容器提供的服务,比如持久性,事务管理(比如使用Bitronix),消息传递(例如使用Apache ActiveMQ和内存中的JNDI)在您自己的JVM中的容器之外。仍然有一种观点认为它是集成测试,单元测试不应该这样做。

根据我的说法,如果你在测试中可以获得良好的性能,那么使用这些第三方实现进行单元测试是很好的,因为你不必花费太多的时间在嘲笑中,嘲笑严重依赖于开发人员错误。如果一个开发人员对嘲笑不甚了解,他最终可能会嘲笑一切,或者换句话说,误用嘲弄将测试变成“绿色”。这是正确的吗? (请提供您对此的看法)

毕竟,我从来没有得到任何固体单元测试的定义:-)。这取决于作者。一些人将“单位”定义为可以测试的最小单位,而另一些则定义为“根据具体情况,这些可以是单个子程序或由紧密相关单位组成的更大组件。”

谢谢。

回答

3

如果您有使用容器服务的代码,然后对其进行测试,则需要模拟这些服务或使用真实的实现。你必须做一个或另一个:没有一些执行的服务,你的代码不会运行,所以不能被测试。

有时,您可以重构代码以删除对容器服务的直接依赖关系,这也将消除模拟这些服务的需要。但不总是。

模拟容器服务比使用真正的实现提供更多的隔离。它还使您能够更好地控制和深入了解代码的执行情况。但是,它也涉及编写更多的代码,并且带来更多的引入错误的风险(mock中的错误,可以直接转化为应用程序代码中的错误)。

有时候嘲讽肯定是有道理的。例如,如果您想编写一个测试来检查您的代码是否在UserTransaction上进行了正确的调用,那么通过模拟比通过试验真实事务监视器更容易。如果您想编写一个测试来检查代码是否正确处理特定的SQLException,那么没有模拟就几乎是不可能的。

除了这些情况,正如您指出的那样,可以使用真实服务编写测试,或者嘲笑它们。正如我认为你已经意识到的那样,传统的单元测试方法是嘲笑它们,或者事实上,将它们包装起来,然后模拟包装。

无论这实际上是必要的还是一个好主意,都非常容易争论。

StackOverflow不应该是主观问题,或辩论或讨论,所以我犹豫在我的意见。我只想说这与我认为自己是一样的 - 正统的“模拟所有移动的方法”是不必要的,也是有害的,我们会用更少的嘲讽编写测试,覆盖更大的真实代码区域会好得多。毕竟,真正的代码就是我们要发布给用户的,所以为什么不测试它呢?

+0

对不起。我的问题未能反映我的想法。我现在编辑了这个问题。你可以现在检查一下吗? – Bala 2011-12-23 15:16:46

+0

我写了更多。不过,我大多数人都同意你的看法。我认为你真的需要有人亲嘲笑你的想法挑战! – 2011-12-23 22:45:19

+0

非常感谢您的回复并提供您的观点:-)我也很乐意从其他人处获取更多意见。 – Bala 2011-12-26 11:05:01