文章目錄
- 前言
- 解決單元測試 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 {@Autowiredprivate 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 {@InjectMocksTestController testController;@MockTestOneService service;@Testpublic 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 方法。