首页 > 解决方案 > 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'.

标签: javarestjunitmockito

解决方案


您必须先创建一个模拟:

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

然后你可以打电话:

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

推荐阅读