2008-10-20 134 views
10

我在我的代码中有一个静态方法,我想以某种方式来模拟。jmock嘲笑一种静态方法

我正在使用jmock。

我想我可以做到这一点的一种方法是围绕静态方法使用“包装类”,并且 模拟这个,但我希望有更好的解决方案。

我正在讨论这个错误的方式?

反馈:

我将有一个接口和类,有一个方法,只是调用静态方法。它可以让我嘲笑对这个包装类的调用来嘲弄逻辑。 (我觉得很脏,甚至谈论它:))

+0

请参阅相关问题[如何模拟静态方法](http://stackoverflow.com/questions/153048/how-to-mock-with-static-methods)。 – flicken 2008-10-20 15:43:22

回答

7

我们不支持在jMock中嘲讽静态方法,因为它不符合我们的设计方法。我们不希望将静态方法用于影响系统状态的重要功能。我们倾向于使用它们来支持OO代码并使其更具可读性。这就是为什么我们认为嘲笑静态方法是暗示有问题。一个例外是它在第三方库中的位置,但我们可能会将它换成更面向对象的东西。

2

Powermock是EasyMock的扩展,允许模拟静态方法。

5

JMockit是另一个允许模拟静态方法(以及最终方法,构造函数等)的工具包。

在设计其他OO解决方案时,我没有看到明智的静态方法的使用问题。

例如,一个图案/成语我喜欢使用的是静态门面,特别是提供一种更简单,更容易在商业应用中使用API​​来持久子系统。在我看来,没有其他解决方案比像更优雅:


    List<Person> peopleAboveAge = 
     find("select p from Person p where p.age >= ?", age); 

其中find方法是静态从PersistenceFacade类只定义静态方法,并封装如何获取正确的会话/ EntityManager实例导入。这个解决方案是单元测试友好和灵活的。我在一个拥有500多个持久实体的业务应用程序中使用它,使用Hibernate。当我们从Hibernate 2迁移到Hibernate 3,从Oracle迁移到Sybase,然后再迁移到Oracle,以及我们开始使用JPA批注而不是用于ORM映射的“hbm.xml”文件时,静态外观有所帮助。