本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看<活动链接>
提问:Mockito为什么不模拟静态方法?
我在这里阅读了一些有关静态方法的主题,我想我理解滥用/过度使用静态方法可能导致的问题。但是我并没有真正理解为什么很难模拟静态方法的原因。
我知道其他模拟框架(例如PowerMock)可以做到这一点,但是为什么Mockito不能?
回答1:
我认为原因可能是模拟对象库通常通过在运行时动态创建类(使用cglib)来创建模拟。 这意味着他们要么在运行时实现一个接口(如果我没有记错,那就是EasyMock所做的事情),或者从类继承来进行模拟(如果我没记错的话,那就是Mockito所做的事情)。 这两种方法均不适用于静态成员,因为您无法使用继承来覆盖它们。
模拟静态变量的唯一方法是在运行时修改类的字节码,我想这比继承要复杂得多。
回答2:
Mockito [3.4.0]可以模拟静态方法!
1, 将mockito-core依赖项替换为mockito-inline:3.4.0。 2, 带有静态方法的类:
class Buddy {
static String name() {
return "John";
}
}
3, 使用新方法Mockito.mockStatic():
@Test
void lookMomICanMockStaticMethods() {
assertThat(Buddy.name()).isEqualTo("John");
try (MockedStatic<Buddy> theMock = Mockito.mockStatic(Buddy.class)) {
theMock.when(Buddy::name).thenReturn("Rafael");
assertThat(Buddy.name()).isEqualTo("Rafael");
}
assertThat(Buddy.name()).isEqualTo("John");
}
Mockito仅替换try块中的静态方法。
文章翻译至 Stack Overflow :stackoverflow.com/questions/4…