我的代码中有一个静态方法,我想以某种方式模拟它。
我正在使用jmock。
我想我可以做到这一点的一种方法是在静态方法周围使用"wrapper class“并模拟这个方法,但我希望有一个更好的解决方案。
我走错路了吗?
反馈:
我将有一个接口和类,其中包含一个调用静态方法的方法。它允许我通过模拟对这个包装器类的调用来模拟逻辑。(我甚至在谈论它时都觉得很脏:)
发布于 2009-05-21 12:51:20
我们不支持在jMock中模拟静态方法,因为它不适合我们的设计方法。我们不喜欢对可能影响系统状态的重要功能使用静态方法。我们倾向于使用它们来支持OO代码,并使其更具可读性。这就是为什么我们把模仿静态方法看作是有问题的提示。一个例外是它在第三方库中,但我们可能会将其包装在更面向对象的东西中。
发布于 2009-06-27 17:35:50
JMockit是另一个允许模拟静态方法(以及最终方法、构造函数等)的工具包。
在设计其他面向对象的解决方案时,我不认为明智地使用静态方法有任何问题。
例如,我喜欢使用的一种模式/习惯用法是静态外观,特别是为业务应用程序中的持久性子系统提供更简单、更容易使用的API。在我看来,没有比下面这样的解决方案更优雅的了:
List<Person> peopleAboveAge =
find("select p from Person p where p.age >= ?", age);其中find方法是从PersistenceFacade类静态导入的,该类只定义静态方法,并封装了如何获得正确的会话/实体管理器实例。该解决方案对单元测试友好且灵活。我使用Hibernate在一个具有500+持久化实体的业务应用程序中使用它。当我们从Hibernate 2迁移到Hibernate 3时,当我们从Oracle迁移到Sybase然后再迁移回Oracle时,当我们开始使用JPA注解而不是"hbm.xml“文件进行ORM映射时,静态facade起到了帮助作用。
发布于 2008-11-04 03:53:16
Powermock是EasyMock的一个扩展,允许模拟静态方法。
https://stackoverflow.com/questions/218813
复制相似问题