java - 对传递给静态方法的值进行单元测试

标签 java unit-testing mockito static-methods

示例代码:

class MyClass {
    public void myMethod(Request request) {
        Item item = getItem();
        ItemUtilHelper.setCertainProperties(newProperty, item);
        differentClass.staticMethod(item);
    }
}

ItemUtilHelper 已经有一个单元测试类来验证项目是否已正确更新。

我将如何进行单元测试以使用更新的 item 参数调用 differentClass.staticMethod

最佳答案

首先让我说静态方法本身就是一种代码味道。 Miško Hevery summed up it quite nicely by saying:

The basic issue with static methods is they are procedural code. I have no idea how to unit-test procedural code. Unit-testing assumes that I can instantiate a piece of my application in isolation.


如果你只想使用 Mockito,你的问题是无法解决的:

What are the limitations of Mockito

Mockito 2.x specific limitations

  • ...

  • Cannot mock static methods

  • ...

(参见 Mockito FAQ)


您可以使用 PowerMock实现你的目标。 但要注意:PowerMock 在字节码级别运行。这意味着

  • 您可能测试的字节码与您在生产中使用的字节码不完全相同(向 Heisenbugs 问好)和
  • 这可以与其他工具结合使用,例如JaCoCo

如果你还想继续,那么你要找的就是 spy 。您可以在 PowerMock's wiki 上找到教程.虽然没有直接关系,但 this question 的答案给出一些关于如何创建一个类的 spy 的额外例子。可以在 Automation Rhapsody 上找到完整的示例.

关于java - 对传递给静态方法的值进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50892214/

相关文章:

java - appengine 上的 printStackTrace()

java - 如何从字符数组创建单词组合/排列?

Ruby 单元测试技术,Mocking 和 Stubbing

java - 测试包含模拟 JPA 存储库的服务时出现 NullPointerException

Java Wicket 表单 : Error serializing object class 'myClassName'

java - 无法解释的 Android Intent 行为

PHP:如何制作可测试的静态方法

java - JMockit : How to inject a MockUp class into a tested class?

java - stream() 方法不适用于 Mockito spy

java - 如何模拟 keystore 类并将模拟行为分配给其方法?