jmock模拟静态方法

时间:2008-10-20 15:26:04

标签: java mocking jmock

我的代码中有一个静态方法,我想以某种方式进行模拟。

我正在使用jmock。

我认为我可以这样做的一种方法是在静态方法周围使用“包装类” 嘲笑这个,但我希望有一个更好的解决方案。

我的方式错了吗?

反馈:

我的接口和类有一个只调用静态方法的方法。它允许我通过模拟对这个包装类的调用来模拟逻辑。 (即使谈论它我也觉得很脏:))

3 个答案:

答案 0 :(得分:8)

我们不支持在jMock中模拟静态方法,因为它不适合我们的设计方法。我们不希望将静态方法用于可能影响系统状态的重要功能。我们倾向于仅使用它们来支持OO代码并使其更具可读性。这就是为什么我们将静态方法视为暗示存在问题的原因。一个例外是它在第三方库中,但我们可能会将其包含在更加面向对象的东西中。

答案 1 :(得分:5)

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

在设计其他OO解决方案时,我认为明智使用静态方法没有任何问题。

例如,我喜欢使用的一种模式/习惯是静态外观,特别是为业务应用程序中的持久性子系统提供更简单易用的API。在我看来,没有其他解决方案比以下更优雅:


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

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

答案 2 :(得分:2)

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