使用Mockito mock一个静态方法

本文介绍了如何在Mockito 3.4.0之后的版本中使用mockito-inline模块来mock静态方法。通过示例展示了如何mock无参数和带参数的静态方法,并在测试用例中验证mock的效果。在测试结束后,确保静态方法的原始行为得以恢复。
摘要由CSDN通过智能技术生成

使用Mockito mock一个静态方法

在3.4.0之前,我们是不能使用Mockito来mock一个静态方法的,而必须使用PowerMockito;但是在之后的版本中已经支持了通过Mockito直接来mock。

下面我们就一步一步来看怎么去使用。

1.一个建单的静态工具类

public class StaticUtils {

    private StaticUtils() {}

    public static List<Integer> range(int start, int end) {
        return IntStream.range(start, end)
          .boxed()
          .collect(Collectors.toList());
    }

    public static String name() {
        return "Baeldung";
    }
}

为了演示,我们提供了一个无参数的返回值为String的方法和一个带参数并返回List的方法。

2.Maven依赖

<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-inline</artifactId>
    <version>3.8.0</version>
    <scope>test</scope>
</dependency>

在本例中,我们使用了mockito-inline版本号为3.8.0的包,当前最新的版本为4.5.1

3.Mock无参数静态方法
下面我们来看看如何Mock无参数的方法-name。

@Test
void givenStaticMethodWithNoArgs_whenMocked_thenReturnsMockSuccessfully() {
    assertThat(StaticUtils.name()).isEqualTo("Baeldung");

    try (MockedStatic<StaticUtils> utilities = Mockito.mockStatic(StaticUtils.class)) {
        utilities.when(StaticUtils::name).thenReturn("Eugen");
        assertThat(StaticUtils.name()).isEqualTo("Eugen");
    }

    assertThat(StaticUtils.name()).isEqualTo("Baeldung");
}

首先我们需要把我们的mockStatic写到try-with-resources代码块中,以确保我们在使用完mock的静态方法后能够及时释放;同时我们会在测试用例的前后分别校验name方法的返回值,确保前后都没有被mock,返回的真实值,符合我们的预期;但是该方法并不一定好实现,如果返回的结果可能会变化不定的话。

4.Mock带参数的静态方法

@Test
void givenStaticMethodWithArgs_whenMocked_thenReturnsMockSuccessfully() {
    assertThat(StaticUtils.range(2, 6)).containsExactly(2, 3, 4, 5);

    try (MockedStatic<StaticUtils> utilities = Mockito.mockStatic(StaticUtils.class)) {
        utilities.when(() -> StaticUtils.range(2, 6))
          .thenReturn(Arrays.asList(10, 11, 12));

        assertThat(StaticUtils.range(2, 6)).containsExactly(10, 11, 12);
    }

    assertThat(StaticUtils.range(2, 6)).containsExactly(2, 3, 4, 5);
}

格式为:

MockedStatic<T> utilities = Mockito.mockStatic(T.class)

utilities.when(() -> T.function(arg1, arg2)) .thenReturn(result);
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用Mockito对PageHelper进行模拟(mock)的步骤如下: 1. 首先,需要导入Mockito库。 2. 创建一个MockedStatic对象,用于模拟PageHelper类的静态方法。 3. 使用mockStatic方法来创建MockedStatic对象,传入PageHelper.class作为参数。 4. 使用when和thenReturn方法来定义模拟的行为。例如,你可以使用when().thenReturn()来模拟PageHelper.startPage方法的返回值。 5. 进行你的测试代码,包括调用需要使用模拟的PageHelper方法的代码。 6. 最后,记得在测试完成后,使用MockedStatic对象的close方法关闭模拟。 下面是一个示例代码,演示了如何使用Mockito对PageHelper进行模拟(mock): ``` import org.junit.Test; import org.mockito.MockedStatic; import static org.mockito.Mockito.*; public class PageHelperMockTest { @Test public void testPageHelperMock() { // 创建模拟对象 MockedStatic<PageHelper> pageHelperMock = mockStatic(PageHelper.class); // 定义模拟的行为 pageHelperMock.when(() -> PageHelper.startPage(anyInt(), anyInt())).thenReturn(planPage); // 进行你的测试代码 // 关闭模拟 pageHelperMock.close(); } } ``` 在这个示例中,我们创建了一个MockedStatic对象pageHelperMock,用于模拟PageHelper类的静态方法。然后使用when和thenReturn方法来定义模拟的行为,模拟了PageHelper.startPage方法的返回值为planPage。最后,在测试完成后,我们使用pageHelperMock的close方法关闭模拟。 请注意,这只是一个简单的示例,实际使用时需要根据具体情况来定义模拟的行为和进行相应的测试。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Mockito3.8 如何mock静态方法 (如何mock PageHelper)](https://blog.csdn.net/weixin_43410352/article/details/118799839)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值