我的代码中有一个静态方法,我想以某种方式来模拟.
我正在使用jmock.
我认为我可以这样做的一种方法是在静态方法周围使用"包装类"并模拟这个,但我希望有一个更好的解决方案.
我这是错误的方式吗?
反馈:
我将有一个接口和类有一个方法,只是调用静态方法.它允许我通过模拟对这个包装类的调用来模拟逻辑.(即使谈论它我也觉得很脏:))
我们不支持在jMock中模拟静态方法,因为它不适合我们的设计方法.我们不希望将静态方法用于可能影响系统状态的重要功能.我们倾向于仅使用它们来支持OO代码并使其更具可读性.这就是为什么我们将静态方法视为暗示存在问题的原因.一个例外是它在第三方库中,但我们可能会将其包装在更加面向对象的东西中.
JMockit是另一个允许模拟静态方法(以及最终方法,构造函数等)的工具包.
在设计其他OO解决方案时,我没有看到明智地使用静态方法的任何问题.
例如,我喜欢使用的一种模式/习惯是静态外观,特别是为业务应用程序中的持久性子系统提供更简单易用的API.在我看来,没有其他解决方案比以下更优雅:
ListpeopleAboveAge = find("select p from Person p where p.age >= ?", age);
其中find
方法是静态从进口PersistenceFacade
限定只有静态方法,并封装了如何获得适当的会话/ EntityManager实例类.该解决方案是单元测试友好且灵活的.我使用Hibernate在具有500多个持久性实体的业务应用程序中使用它.当我们从Hibernate 2迁移到Hibernate 3时,静态外观帮助我们从Oracle迁移到Sybase然后再迁移到Oracle,当我们开始使用JPA注释而不是"hbm.xml"文件进行ORM映射时.