【问题标题】:How to avoid NullPointerException in test used MockMvc?如何在使用 MockMvc 的测试中避免 NullPointerException?
【发布时间】:2013-10-25 15:17:47
【问题描述】:

我有控制器:

@Controller
public class EventMenuController{

    @RequestMapping(value = "/updateEvent", method = RequestMethod.POST)
    public String updateEvent(Model model,
            @Valid @ModelAttribute("existedEvent") Event event,
            BindingResult result,
            @ModelAttribute("linkedCandidates") Set<Candidate> candidates,
            @ModelAttribute("linkedvacancies") Set<Vacancy> vacancies,
            @RequestParam(required = true, value = "selectedEventStatusId")Integer EventStatusId,
            @RequestParam(required = true, value = "selectedEventTypeId")Integer EventTypeId ,
            RedirectAttributes attributes) {
        if (result.hasErrors()) {
            //model.addAttribute("idEvent", event.getId());
            event.setCandidates(candidates);
            event.setVacancies(vacancies);
            return "eventDetails";
        }
        eventService.updateEventAndLinkedEntities(event, candidates, vacancies ,EventTypeId,EventStatusId);
        attributes.addAttribute("idEvent",event.getId() );//event is null therefore NPE here
        attributes.addAttribute("message", "submitted correctly at "+new Date());
        return "redirect:eventDetails";
     }
 }

为了测试这个方法,我编写了以下类:

@ContextConfiguration(locations = { "classpath:/test/BeanConfigUI.xml" })
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
public class EventMenuControllerTest {


    @Test
    public void updateEvent() throws Exception{
        MockHttpServletRequestBuilder request = MockMvcRequestBuilders
                .post("/updateEvent");
        request.param("selectedEventStatusId", "1");
        request.param("selectedEventTypeId", "1");

        EventMenuController eventMenuController = (EventMenuController) wac.getBean("eventMenuController");
        EventService mockEventService = Mockito.mock(EventService.class);
        eventMenuController.eventService = mockEventService;

        Mockito.doNothing().when(mockEventService).updateEventAndLinkedEntities(any(Event.class), any(Set.class),any(Set.class), any(Integer.class), any(Integer.class));

        ResultActions result = mockMvc.perform(request);

        result.andExpect(MockMvcResultMatchers.view().name("redirect:eventDetails"));
        result.andExpect(MockMvcResultMatchers.model().attributeExists("idEvent"));
        result.andExpect(MockMvcResultMatchers.model().attributeExists("message"));

    }

}

在服务器端执行的进程请求中,我看到错误,表明事件对象为空。

问题:

我必须使用 MockMvc 将传递事件写入服务器端(控制器方法)的什么请求?

【问题讨论】:

    标签: java testing spring-mvc mocking spring-mvc-test


    【解决方案1】:

    Event 类对象未初始化。您可以根据您的测试用例创建Event 对象或创建Event 对象的模拟并将其发送到EventMenuController 类对象。您可以像将模拟对象 EventService 发送到 EventMenuController 一样执行此操作。

    最好将字段用作类的一部分而不是方法的一部分。这将使您可以灵活地模拟任何字段。

    【讨论】:

    • "您可以根据您的测试用例创建一个 Event 对象或创建一个 Event 对象的 mock 并将其发送到 EventMenuController 类对象"我该怎么做?
    • "你可以这样做类似于你如何将 EventService 的模拟对象发送到 EventMenuController" 我不明白如何
    • 事件是一个局部变量!
    • 如果您可以使 Event 对象成为 EventMenuController 类的成员,您可以使用 getter 方法将其替换为模拟对象。
    • 但是如果我不成功我还有其他方法吗?
    猜你喜欢
    • 1970-01-01
    • 2019-07-30
    • 2022-11-02
    • 2011-11-20
    • 2012-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    相关资源
    最近更新 更多