我的代码中有一个静态方法,我想以某种方式模拟。
我正在使用 jmock。
我想我可以做到这一点的一种方法是在静态方法周围有“包装类”并模拟它,但我希望有一个更好的解决方案。
我会以错误的方式解决这个问题吗?
回馈:
我将有一个接口和类,它有一个调用静态方法的方法。它允许我通过模拟对这个包装类的调用来模拟逻辑。(即使谈论它我也觉得很脏:))
我们不支持在 jMock 中模拟静态方法,因为它不适合我们的设计方法。对于可能影响系统状态的重要功能,我们不喜欢使用静态方法。我们倾向于使用它们只是为了支持 OO 代码并使其更具可读性。这就是为什么我们将模拟静态方法视为存在问题的暗示。一个例外是它位于第三方库中,但无论如何我们可能会将其包装在更面向对象的东西中。
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 映射时,静态外观会有所帮助。
Powermock是 EasyMock 的扩展,允许模拟静态方法。