CodeGym/Java 课程/模块 3/使用 Mockito 的流行场景

使用 Mockito 的流行场景

可用

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,但非常实用。当无法模拟在被测方法内部使用的简单静态方法时,编写测试非常困难。

评论
  • 受欢迎
你必须先登录才能发表评论
此页面还没有任何评论