如何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
相关产品推荐
相关产品推荐

