6.1 模拟静态方法 mockStatic()
还有一个更重要的一点是静态方法的模拟和验证。“那有什么问题吗?”你问。是的,静态的,但是方法是一样的。你会错的。
还记得我们是从哪里开始学习模拟对象的吗?由于这些对象是通过DynamicProxy
. 并且静态方法不绑定任何对象,DynamicProxy
不可能通过.拦截对它们的调用。就这样。
但是 Mockito 的创建者也能够在这里躲避 - 他们编写了自己的类加载器,并且在它的帮助下他们能够动态替换类。一项艰巨的工作,但他们仍然设法做到了。
您将需要添加一个额外的库到pom.xml
:
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-inline</artifactId>
<version>4.2.0</version>
<scope>test</scope>
</dependency>
如果你需要模拟一个静态方法,下面是如何工作的。
1 创建一个特殊的模拟类对象:
MockedStatic<ClassName>managerObject = Mockito.mockStatic(ClassName.class);
2 给这个对象添加操作规则:
为了规则的这个目标,有必要以其他方式坚持。
managerObject.when(ClassName::method name).thenReturn(result);
3一定要将这个对象的使用包裹进去,try-with-resources
这样这个对象会立即被删除,Mockito 可以清除与之关联的规则。
例子:
@Test
void givenStaticMethodWithNoArgs () {
try (MockedStatic< StaticUtils> utilities = Mockito.mockStatic( StaticUtils.class)) {
// add rule
utilities.when(StaticUtils::name).thenReturn("Hello");
// check if the rule works
assertEquals("Hello", StaticUtils.name());
}
}
@Mock
没有注释和那样漂亮@Spy
,但非常实用。当无法模拟在被测方法内部使用的简单静态方法时,编写测试非常困难。
GO TO FULL VERSION