controller代码:
@PostMapping("/exportAllBank/{contracts}") @PreAuthorize("hasAuthority('contract:exportAllBank')" public ResponseResult exportAllBank(@PathVariable("contracts") List<Integer> contracts){ //获取转换后的list List<ContractDto> contractDtoList = contractService.selectAllBank(contracts); //如果目录不存在,创建目录 execlServer.createDirectory(Constants.excelDirectory); //导出文件的存放路径及名字 String fileName = Constants.excelDirectory+ System.currentTimeMillis()+"contract.xlsx"; EasyExcel.write(fileName,ContractDto.class) .sheet("业务信息") .doWrite(contractDtoList); return ResponseResult.succ("导出成功:"+fileName); }
test代码:
@Test @WithMockUser(authorities = "contract:exportAllBank") void exportAllBank() throws Exception { List<Integer> contracts = new ArrayList<>(); List<ContractDto> contractDtoList = new ArrayList<>(); when(contractService.selectAllBank(contracts)).thenReturn(contractDtoList); doNothing().when(execlServer).createDirectory(Constants.excelDirectory); ExcelWriterBuilder excelWriterBuilder = mock(ExcelWriterBuilder.class); ExcelWriterSheetBuilder excelWriterSheetBuilder = mock(ExcelWriterSheetBuilder.class); try (MockedStatic<EasyExcel> mb = Mockito .mockStatic(EasyExcel.class)){ mb.when(() -> EasyExcel.write("", ContractDto.class)) .thenReturn(excelWriterBuilder); when(excelWriterBuilder.sheet(any(String.class))).thenReturn(excelWriterSheetBuilder); doNothing().when(excelWriterSheetBuilder).doWrite(contractDtoList); } ResultActions resultActions = mockMvc.perform(MockMvcRequestBuilders .post("/contract/exportAllBank/{contracts}",1) .accept(MediaType.APPLICATION_JSON_VALUE) ); resultActions.andReturn().getResponse().setCharacterEncoding("UTF-8"); resultActions.andDo(MockMvcResultHandlers.print()); resultActions.andExpect(MockMvcResultMatchers.status().isOk()); }
控制台报错:
org.mockito.exceptions.misusing.MissingMethodInvocationException:
when() requires an argument which has to be 'a method call on a mock'.
For example:
when(mock.getArticles()).thenReturn(articles);
Also, this error might show up because:
1. you stub either of: final/private/equals()/hashCode() methods.
Those methods *cannot* be stubbed/verified.
Mocking methods declared on non-public parent classes is not supported.
2. inside when() you don't call method on mock but on some other object.
网上搜索的解决方案是使用powerMockito,使用了之后报另外的错误,搜索后发现其不兼容Junit5,于是我弃用了该解决方案。目前网上没有找到可以解决此问题的方法,求大神解答。