6.9 Mockito为什么不模拟静态方法?| Java Debug 笔记

315 阅读1分钟

本文正在参加「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…