Сбой MockMvc из-за вызова метода внутри метода контроллера - PullRequest
0 голосов
/ 09 мая 2019

Я пытаюсь смоделировать контроллер, который содержит метод util внутри, хотя я высмеиваю метод util, mvcMock игнорирует результат операции when (...) и снова вызывает метод с пустыми параметрами, которые приводят к nullpointerexception

Как я могу отправить вызов

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

с помощью 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)));
}

Ответы [ 2 ]

1 голос
/ 09 мая 2019

1) В контроллере переместите строку:

util.getOperatorsAdNameWrapper(userName, operatorsSet);

в метод уровня пакета:

Set<String> getOperatorsAdNameWrapper(userName, operatorsSet){
   return util.getOperatorsAdNameWrapper(userName, operatorsSet); 
}

2) В своем тесте используйте SpyBean:

@SpyBean
private Controller controllerSpy;

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

   doReturn(roleSet).when(controllerSpy).getOperatorsAdNameWrapper(userName, adNames);

Общая суть в том, что вы не можете высмеивать статический вызов с ванильным Mockito.Сначала нужно немного изменить рефакторинг.

0 голосов
/ 10 мая 2019

Проблема была с классом Util , так как я использую mockmvc как модульное тестирование, а не как интеграционный тест standaloneSetup

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

чтобы класс Util не загружался в контекст, чтобы решить эту проблему, вам нужно указать параметр

  1. Переместить метод-обертку в классе util в класс обслуживания, и оттуда вы можете обернуть статический метод вКласс Util
  2. Добавление класса util в конструктор контроллера
...