java - when-then-Return 函数不起作用
问题描述
我正在为控制器类编写 JUnit 测试。我尝试了几种方法,但是每次都绕过 when.thenReturn() 。以下是示例代码:
控制器类:
@RestController
public class FundController {
@Autowired
private FundDAO msDAO = new FundDAO();
private FundUtil msUtil = new FundUtil();
@PostMapping(value = "/v1/fund/search", produces = { MediaType.APPLICATION_JSON_VALUE })
public FundSearchResponse fundNameSearch(
@ApiParam(name = "fundName", value = "fund names in form of JSON", required = true) @RequestBody(required = true) fundName fundNameRequest,
@ApiParam(name = "limit", value = "Number of Records per page", required = false, defaultValue = "10") @RequestParam(value = "limit", required = false, defaultValue = "10") Integer limit) {
FundSearchResponse fundSearchResponse = new FundSearchResponse();
if (!msUtil.validatefundSearchRequest(fundNameRequest, limit)) {
String validationMsg = msUtil.getValidationMsg();
fundSearchResponse.setResponse(
msUtil.buildServiceResponse(Constants.CODE_400_BAD_REQUEST, Constants.TYPE_400_BAD_REQUEST,
validationMsg.isEmpty() ? Constants.DESC_400_BAD_REQUEST : validationMsg));
fundSearchResponse.setfunds(null);
fundSearchResponse.setTotalRecords(0);
}
else {
try {
fundSearchResponse = msDAO.fundNameSearch(fundNameRequest.getfundName(), limit);
if (fundSearchResponse.getfunds() != null) {
fundSearchResponse.setTotalRecords(fundSearchResponse.getfunds().size());
fundSearchResponse.setResponse(msUtil.buildServiceResponse(Constants.CODE_200_SUCCESS));
} else {
fundSearchResponse.setTotalRecords(0);
fundSearchResponse.setResponse(msUtil.buildServiceResponse(Constants.CODE_200_SUCCESS,
Constants.TYPE_200_SUCCESS, Constants.DESC_404_NOT_FOUND));
}
} catch (ApiException e) {
fundSearchResponse.setResponse(msUtil.buildServiceResponse(e.code, e.type, e.getMessage()));
fundSearchResponse.setTotalRecords(0);
}
}
return fundSearchResponse;
}
JUnit 测试类:
@WebMvcTest(controllers = FundController.class)
@ActiveProfiles("test")
public class FundTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private FundDAO msDAO;
private FundUtil msUtil;
private fundName fundName;
@Before
public void setUp() {
fundName = MockData.getfundName();
msUtil = new FundsOrchestratorUtil();
msDAO = new FundsOrchestratorDAO();
}
@Test
public void shouldFetchAllUsers() throws Exception {
fundsSearchResponse fundSearchResponse = MockData.getfundsSearchResponse();
when(msUtil.validatefundSearchRequest(fundName, 5)).thenReturn(true); // Problem : getting bypassed to Util class
//given(msUtil.validatefundSearchRequest(Mockito.any(fundName.class), Mockito.anyInt())).willReturn(true);
given(msDAO.fundNameSearch(Mockito.anyString(), Mockito.anyInt())).willReturn(fundSearchResponse);
this.mockMvc.perform(post("/v1/funds/search"))
.andExpect(status().isOk());
}
}
我关注了这个网站JUnit 和 Mockito,因为我通常的 JUnit ( @RunWith(SpringJUnit4ClassRunner.class)
) 方式不起作用。尽管这两者几乎相同,但问题仍然存在。由于使用 when().thenReturn() 的类调用限制不起作用。我不擅长 JUnit,所以我可能会遗漏一些东西。请让我知道如何完成这项工作。由于依赖类正在寻找对象中的数据,在这种情况下,该对象作为 Mockito.any(Classname.class) 传递。当与带有数据的对象一起传递时,它的给出错误
org.mockito.exceptions.misusing.MissingMethodInvocationException:
when() requires an argument which has to be 'a method call on a mock'.
解决方案
您必须先创建一个模拟:
FundUtil fundUtilMock = org.mockito.Mockito.mock(FundUtil.class);
然后你可以打电话:
when(fundUtilMock.validatefundSearchRequest(fundName, 5)).thenReturn(true);
推荐阅读
- docker - 如何在两个服务之间共享 docker 卷,其中一个是事实来源?
- python - 并行化pytorch中的嵌套for循环
- python - python:pyti平均真实范围函数输入的列表结构
- django - django rest框架知道视图是类还是函数
- php - 如何使用 Laravel 在数据库中搜索未知的属性名称
- dataweave - 无法在 dataweave 中转换 json 数组
- asp.net-core - .net 核心 BlockingCollection 的多个动态消费者
- java - 这个模拟代码不编译的原因是什么?
- asp.net - VB.net aspX 图像调整大小和创建文件权限被拒绝
- javascript - javascript 是否具有与 php 魔术类 __call 等效的功能