mockitojunit5spring-boot-testhittestmockmvc

MockMvc fails because of method invocation inside the controller method


I try to mock a controller which contains a util method inside even though I mock the util method, the mvcMock ignore the result from the when(...) and call the method again with empty parameters which lead to nullpointerexception

How I can ship the call of

when(utilMock.getOperatorsAdNameWrapper(userName, adNames)).thenReturn(roleSet);

with the mockMvc.perform?

@GetMapping(value = {"/wellbore"})
public String wellboreForm(Model model, @RequestParam("mode") String mode, HttpServletRequest request) {

    Set<String> operators = new LinkedHashSet<>();
    String userName = (String) request.getSession().getAttribute("userName");
    Set<String> operatorsSet = (HashSet<String>) request.getSession().getAttribute("userRoles");


    Set<String> operatorsAdName = util.getOperatorsAdNameWrapper(userName, operatorsSet);
    operatorsAdName.forEach(adName -> {
        Query query = new Query()
                .setClassname(Wellbore.CLASS)
                .eq(Wellbore.operatorsGroup, adName);
        operators.addAll(getWellboresNameList(query));
    });

        model.addAttribute("wellboreDataList", operators);
        model.addAttribute("wellboreData", new WellboreForm());

        return "ui/selectWellbore";
}



 public static Set<String> getOperatorsAdName(String userName, Set<String> operatorsAdName) {
    operatorsAdName.removeIf(x -> x.equals(userName)
            || x.equals("SCOUT")
            || x.equals("GTO")
            || x.equals("KADME")
            || x.equals("offline_access")
            || x.equals("uma_authorization"));

    return operatorsAdName;
}

public Set<String> getOperatorsAdNameWrapper(String userName, Set<String> operatorsAdName) {
    return getOperatorsAdName(userName,operatorsAdName);
}


@Mock
private Util utilMock;

@Test
@DisplayName("GET /wellbore - Select Wellbore")
void testMockMvc() throws Exception {


    HttpServletRequest req = Mockito.mock(HttpServletRequest.class);
    when(req.getAttribute("userName")).thenReturn("abcd");

    String userName = (String) req.getAttribute("userName");

    //Here I get the correct result Result 
    when(utilMock.getOperatorsAdNameWrapper(userName, adNames)).thenReturn(roleSet); 

    //another call made here with empy parameters to utilMock.getOperatorsAdNameWrapper("", null)
    mockMvc.perform(get("/wellbore").param("mode","selectWellbore")
            .sessionAttr("wellboreDataList", new LinkedHashSet<>())
            .sessionAttr("wellboreData", new WellboreForm())
    )
            .andExpect(status().isOk())
            .andExpect(view().name("ui/selectWellbore"))
            .andExpect(model().attribute("wellboreDataList", hasSize(2)));
}

Solution

  • The Problem was with the Util class since I am using mockmvc as unit testing, not as integration test by standaloneSetup

     mockMvc = MockMvcBuilders
                //To avoid loading springContext
                .standaloneSetup(controller)
                .setViewResolvers(viewResolver())
                .build();
    

    so the Util class not loaded to the context to solve this you have to option

    1. Move the wrapper method in the util class to the service class and from there you can wrapper the static method in the Util class
    2. Add the util class to the controller constructor