когда функции возврата не работают

#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);