繁体   English   中英

jmock模拟静态方法

[英]jmock mocking a static method

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

我正在使用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的扩展,允许模拟静态方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM