#java #rest #junit #mockito
Вопрос:
Я пишу тесты 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() не работают. Я не силен в Джуните, так что, возможно, я что-то упускаю. Пожалуйста, дайте мне знать, как это сделать. Поскольку зависимый класс ищет данные в объекте, который в этом случае передается как Mockito.any(Classname.class). Когда передается объект с данными, он выдает ошибку
org.mockito.exceptions.misusing.MissingMethodInvocationException:
when() requires an argument which has to be 'a method call on a mock'.
Ответ №1:
Сначала вы должны создать макет :
FundUtil fundUtilMock = org.mockito.Mockito.mock(FundUtil.class);
Тогда вы можете позвонить :
when(fundUtilMock.validatefundSearchRequest(fundName, 5)).thenReturn(true);