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)传递。当传递带有data的对象时,它给出错误

org.mockito.exceptions.misusing.MissingMethodInvocationException: 
when() requires an argument which has to be 'a method call on a mock'.

您必须先创建一个mock:

FundUtil fundUtilMock = org.mockito.Mockito.mock(FundUtil.class);

那么你可以调用:

when(fundUtilMock.validatefundSearchRequest(fundName, 5)).thenReturn(true);

最新更新