1.概述

在编写单元测试时,我们经常会遇到需要模拟静态方法的情况。在Mockito的3.4.0版本之前,它不可能直接模拟静态方法-只有借助PowerMockito

在本教程中,我们将了解如何使用最新版本的Mockito模拟静态方法。要了解更多关于使用Mocki雷竞技app官网网站to进行测试的信息,请查看我们全面的5系列

2.一个简单的静态实用程序类

在本教程中,我们测试的重点将是一个简单的静态实用程序类:

public class StaticUtils {private StaticUtils() {} public static List range(int start, int end) {return IntStream. int;range(start, end) .boxed() .collect(collections . tolist ());} public static String name() {return "B雷竞技app下载官方版isoaeldung";} }

出于演示目的,我们有一个带有一些参数的方法,而另一个方法仅返回字符串

3.依赖关系

让我们开始添加mockito-inline依赖我们pom.xml

<依赖> < groupId > org。 3.8.0 test  . txt > < br > < br > < br > < br > < br > < br > < br > < br > < br > < br

值得注意的是,在某种程度上文档,这个功能可以很好地集成到更熟悉的mockito-core依赖。

4.关于静态方法测试的简短介绍

一般来说,有些人可能会说写的时候干净面向对象代码,我们不需要模拟静态类。这通常意味着设计问题或代码味道在我们的应用程序。

首先,因为依赖于静态方法的类具有紧密耦合,其次,它几乎总是导致难以测试的代码。理想情况下,类不应该负责获取它的依赖项,如果可能的话,它们应该从外部注入。

因此,如果我们能够重构我们的代码,使其更具可测试性,这总是值得研究的.当然,这并不总是可能的,有时我们不得不模仿静态方法。

5.模拟一个无参数静态方法

让我们来看看如何嘲弄的名字方法从我们StaticUtils类:

@Test void givenStaticMethodWithNoArgs_whenMocked_thenReturnsMockSuccessfully() {assertThat(StaticUtils.name()).isEqualTo("B雷竞技app下载官方版isoaeldung");try (MockedStatic utilities = Mockito.mockStatic(StaticUtils.class)) {utilities.when(StaticUtils::name).thenReturn(“Eugen”);为了(StaticUtils.name ()) .isEqualTo(“尤金”);}为了(StaticUtils.name ()) .isEqualTo(“Baeldun雷竞技app下载官方版isog”);}

如前所述,从Mockito 3.4.0开始,我们可以使用Mockito.mockStatic (类< T >classToMock方法模拟对静态方法调用的调用。此方法返回MockedStatic对象,它是一个作用域模拟对象。

因此,在上面的单元测试中公用事业公司变量表示具有线程局部显式作用域的模拟。重要的是要注意,作用域模拟必须由激活模拟的实体关闭.这就是为什么我们在try-with-resources构造,以便在我们结束作用域块时自动关闭mock。

这是一个特别好的特性,因为它确保我们的静态模拟仍然是临时的。正如我们所知道的,如果我们在测试运行期间使用静态方法调用,由于运行测试的并发性和顺序性,这可能会在测试结果中导致不利影响。

在此之上,另一个很好的副作用是,我们的测试仍然运行得非常快,因为Mockito不需要为每个测试替换类加载器。

在我们的示例中,我们通过在限定范围的块之前和之后检查静态方法来重新迭代这一点的名字返回实值。

6.用参数模拟一个静态方法

现在,让我们看看另一个常见的用例,当我们需要模拟一个有参数的方法时:

@Test void givenStaticMethodWithArgs_whenMocked_thenReturnsMockSuccessfully() {assertThat(StaticUtils. staticmethodwithargs_whenmocked_thenreturnsmocksuccessfully ();范围(2,6))。containexactly (2, 3, 4, 5);try (MockedStatic utilities = Mockito.mockStatic(StaticUtils.class)) {utilities.when(() -> StaticUtils.class);范围(2,6)).thenReturn(数组。asList(10、11、12));为了(StaticUtils。范围(2,6))。containsExactly(10、11、12);}为了(StaticUtils。范围(2,6))。containexactly (2, 3, 4, 5);}

如我们所见,我们遵循与以前相同的方法,只是这次使用lambda表达式在我们子句,其中指定方法以及要模拟的任何参数.很简单的!

7.结论

在这篇快速的文章中,我们已经看到了几个如何使用Mockito来模拟静态方法的示例。总之,Mockito提供了一种优雅的解决方案,通过一个较小的lambda对mock静态对象使用更窄的范围。

与往常一样,本文的完整源代码是可用的在GitHub

通用的底部

开始使用Spring 5和Spring Boot 2,通过学习的春天课程:

>>看看这个课程
1评论
最古老的
最新的
内联反馈
查看所有评论
对这篇文章的评论关闭!