【问题标题】:Jmock - How to mock a static method [duplicate]Jmock - 如何模拟静态方法
【发布时间】:2012-09-07 02:42:55
【问题描述】:

可能重复:
jmock mocking a static method

我正在使用 XX 类的静态方法进行遗留单元测试。我现在更改了类以从 Spring 应用程序上下文中获取字段值。由于无法初始化 XX 类,单元测试现在失败。

我不能用 dummysupport 类包装 XX 类,因为要测试的逻辑很复杂,而且对 XX 类的调用嵌套在对其他遗留类的多层调用中。 所以我试图找到一种方法来模拟类 XX 中的静态方法。有没有办法做到这一点?我正在使用 Jmock 库。

【问题讨论】:

    标签: java testing junit jmock


    【解决方案1】:

    似乎没有办法在 JMock 中模拟静态方法。见this related thread。 JMock 的创建者似乎采取精英主义观点,即如果您的代码中有静态方法,则您的代码不值得使用 JMock 进行测试。

    我建议使用像 JMockit 这样的工具,它提供了功能更全面的模拟工具集。

    【讨论】:

    • 哦...在这种情况下,Jmock 和 Jmockit 可以一起工作。现有测试使用 jmock 来测试功能。现在,如果我用 JmockIt 模拟 XX 类,其他模拟对象(Jmock)可以使用它吗?
    • 哇,@Jeff,我认为称他们为“精英主义者”有点牵强,因为他们暗示过度使用静力学有时表明存在设计问题。而且我不是 JMock 的辩护者(从未使用过它)。它只是不符合他们的设计方法,即使你不同意他们的理由,这根本不是精英主义的说法。 “不值得被测试......”不过,我会给你一个 +1 的戏剧性和幽默感。
    • @Kevin...不,我认为它非常准确。那里的许多模拟框架都像 Steve Freeman 在链接问题中所做的那样声明:“我们不支持在 jMock 中模拟静态方法,因为它不适合我们的设计方法”。我认为这是精英主义......基本上是对试图用静态测试代码的用户说,对不起,你做错了。
    • @maverik - 是的,如果你愿意,你可以混合使用这两个框架。或者只是 JMockit(或 RNJ 提到的 PowerMock),因为 JMockit 会做你需要的一切。
    • @JeffOlson 如果您提交一个提供静态方法支持的补丁,看看他们的回复会很有趣。如果他们拒绝,那么也许他们是精英主义者。如果他们接受它,那么也许他们只是测试爱好者,他们将自己的个人时间用于推进他们喜欢的方法。在我眼里不算犯罪。
    【解决方案2】:

    我相信 powermock 允许您像详细 here 那样模拟静态数据

    我过去也遇到过这个问题,并设法围绕它编写代码,因此我可以通过使方法非静态但对类具有静态引用来使用 JMock。

    例如

    public ClassToMock {
        public static final ClassToMock INSTANCE = new ClassToMock();
    
        private ClasstToMock() {};
    
        public void newNonStaticMethod1(){}
    }
    

    而不是

    public ClassToMock {
    
        public ClasstToMock() {};
    
        public void static origStaticMethod1(){}
    }
    

    现在你的方法调用将是

    ClassToMock.INSTANCE.newNonStaticMethod1();
    

    由于 newNonStaticMethod1() 不是静态的,您现在可以模拟它。

    由于 CalssToMock ctor 是私有的,它只能通过静态实例访问。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-26
      • 1970-01-01
      • 2010-09-14
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多