解决单元测试 mock final类报错
文章目录
- 前言
- 解决单元测试 mock final类报错
- 1. 报错原因
- 2. 解决方案
- 3. 示例demo
- 4. 扩展
前言
如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。
而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!!
解决单元测试 mock final类报错
1. 报错原因
如果mock final类的话会报下面的错误。
原因是 Mockito 默认不支持 final 类和 final 方法的 mock,因此无法直接使用传统的 Mockito 进行 mock 。
2. 解决方案
因为我的项目使用的springBoot 版本为2.3.4,因此我对应的mockito-core版本为3.12.4
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>3.12.4</version>
<scope>test</scope>
</dependency>
因此对于该版本我只能使用 PowerMock 的方式来进行 mock final类。
对应的pom:
<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>
3. 示例demo
测试类:
public class TestController {
@Autowired
private TestOneService service;
public void yyyy(HttpServletResponse response){
HSSFWorkbook yyyy = service.yyyy();
try {
ServletOutputStream outputStream = response.getOutputStream();
yyyy.write(outputStream);
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
单元测试类:
@RunWith(PowerMockRunner.class)
@PrepareForTest({HSSFWorkbook.class})
@PowerMockIgnore({"javax.net.ssl.*","javax.management.*"})
public class TestControllerTest {
@InjectMocks
TestController testController;
@Mock
TestOneService service;
@Test
public void test() throws IOException {
HttpServletResponse response = Mockito.mock(HttpServletResponse.class);
ServletOutputStream outputStream = Mockito.mock(ServletOutputStream.class);
HSSFWorkbook hssfWorkbook = PowerMockito.mock(HSSFWorkbook.class);
PowerMockito.when(service.yyyy()).thenReturn(hssfWorkbook);
PowerMockito.when(response.getOutputStream()).thenReturn(outputStream);
testController.yyyy(response);
Assert.assertTrue(true);
}
}
这里的重点在于使用PowerMockito来进行mock:
HSSFWorkbook hssfWorkbook = PowerMockito.mock(HSSFWorkbook.class);
同时添加 HSSFWorkbook 以支持 mock
@PrepareForTest({HSSFWorkbook.class})
执行效果:
4. 扩展
如果你的 Spring Boot是 2.5 及以上版本中,可以使用 Mockito 4.x 版本,该版本 mocking 已经支持 final 类和 final 方法。