当前位置: 首页 > 面试题库 >

Java 为什么Mockito不模拟静态方法?

杭涵映
2023-03-14
问题内容

我在这里阅读了一些有关静态方法的主题,我认为我理解滥用/过度使用静态方法可能导致的问题。但是我并没有真正理解为什么很难模拟静态方法的原因。

我知道其他模拟html" target="_blank">框架(例如PowerMock)可以做到这一点,但为什么Mockito不能?


问题答案:

我认为原因可能是模拟对象库通常通过在运行时动态创建类(使用cglib)来创建模拟。这意味着他们要么在运行时实现一个接口(如果我没有记错的话,这就是EasyMock所做的事情),要么从类中继承要模拟的东西(如果我没记错的话,这就是Mockito所做的事情)。这两种方法都不适用于静态成员,因为你不能使用继承来覆盖它们。

模拟静态变量的唯一方法是在运行时修改类的字节码,我想这比继承要复杂得多。

这就是我的猜测,这是值得的…



 类似资料:
  • 问题内容: 我已经写了一家工厂来生产物体: 我想验证传递给的参数,但不知道如何模拟静态方法。我在测试用例中使用的是和。有没有模拟或验证此特定用例的好方法? 问题答案: 在Mockito上使用PowerMockito。 示例代码:

  • 我正在尝试使用JUnit、Mockito和PowerMock验证对的调用。 下面是我的测试用例: 下面是测试中的代码: 非常有趣的是,这段代码失败时出现:

  • 我想为我的更改编写测试,但遇到了问题--更改是在静态方法内进行的。代码如下所示 我想要的是模拟方法A和B,并且doSomething和所有这些在方法C中使用的静态方法,但目前我找不到任何方法来做到这一点。你现在有吗?

  • 我不知道我的代码出了什么问题,我的静态方法都不能被 Mockito 嘲笑...... 我检查了几个小时,似乎我的代码没有任何错误。 下面是依赖性: 下面是静态方法: 下面是测试类: 运行测试后,我得到了这个异常:

  • 例如,我有以下课程: 我有一个类使用她的方法: 测试等级: 尝试运行测试时遇到的错误: 组织。莫基托。例外情况。基础MockitoException:对于TesteStatico,静态模拟已在当前线程中注册以创建新的模拟,必须取消注册现有的静态模拟注册 项目中LIB的版本: junit-jupiter 5.5.2 mockito-junit-jupiter 3.2.14 mockito-内联3.2

  • 实际的方法是在第3行被调用()。我已经添加了和注释。 为什么调用实际方法?我也尝试了PowerMockito.do返回,但是得到了同样的问题。