You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何Mock未实现接口的默认方法?JUnit/Mockito/PowerMockito实践

测试DemoUser的doUserBusiness方法:Mock UserService静态方法与默认方法

要Mock UserService.getService().getUserById(userId) 并返回模拟的User对象,需要结合PowerMockito(处理静态方法)和Mockito(处理接口方法)来实现,步骤如下:

1. 添加必要依赖

确保测试依赖中包含JUnit、Mockito和PowerMockito(版本需兼容),以Maven为例:

<!-- JUnit -->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13.2</version>
    <scope>test</scope>
</dependency>
<!-- Mockito -->
<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>3.12.4</version>
    <scope>test</scope>
</dependency>
<!-- PowerMockito -->
<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-module-junit4</artifactId>
    <version>2.0.9</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-api-mockito2</artifactId>
    <version>2.0.9</version>
    <scope>test</scope>
</dependency>

2. 编写测试类

测试类需要使用PowerMock的运行器,并指定要处理的静态类,具体代码如下:

import com.learning.model.user.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

import static org.mockito.Mockito.when;
import static org.mockito.Mockito.verify;

@RunWith(PowerMockRunner.class)
@PrepareForTest(UserService.class) // 告知PowerMock要处理UserService的静态方法
public class DemoUserTest {

    @Mock
    private User mockUser; // 模拟的User对象

    @Test
    public void testDoUserBusiness() {
        // 步骤1:Mock UserService的静态方法getUserService,返回一个Mock的UserService实例
        UserService mockUserService = PowerMockito.mock(UserService.class);
        PowerMockito.mockStatic(UserService.class);
        when(UserService.getUserService()).thenReturn(mockUserService);

        // 步骤2:设定Mock的UserService调用getUserById时返回模拟的User
        String testUserId = "123";
        when(mockUserService.getUserById(testUserId)).thenReturn(mockUser);

        // 步骤3:执行被测方法
        DemoUser demoUser = new DemoUser();
        demoUser.doUserBusiness(testUserId);

        // 步骤4:验证方法调用(可选,根据测试需求确认逻辑是否正确触发)
        verify(mockUserService).getUserById(testUserId);
    }
}

关键说明

  • @RunWith(PowerMockRunner.class):指定测试用PowerMock的运行器执行,才能支持静态方法Mock
  • @PrepareForTest(UserService.class):让PowerMock提前处理UserService类,实现静态方法的Mock
  • 默认方法getUserById可以直接通过Mockito进行Mock,无需额外配置

内容的提问来源于stack exchange,提问作者Đức Trường Đặng

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 03:42:40