单元测试包含自定义验证的控制器

时间:2016-06-09 02:42:21

标签: java spring validation unit-testing

我正在尝试为我的控制器进行单元测试。 这是我想要测试的控制器的方法:

public class SomeController {

    @Autowired public RequestValidator reqValidator;
    @Autowired public SomeService service;

    @ResponseBody
    @RequestMapping(value = "/Inquiry", method = RequestMethod.GET)
    public String inquiry(HttpServletRequest httpServletRequest, @ModelAttribute Request req, BindingResult bindingResult) {

        reqValidator.validate(req, bindingResult);
        if (bindingResult.hasErrors()) {
            return something;
        }
        return service.inquiry(req);
    }
}

ReqValidator是我实现的自定义验证器,用于检查每个请求字段是否为空,太长,以及我无法通过hibernate验证器实现的其他一些事情。

无论如何,我正在测试此方法的成功方案。这是我的测试方法。

public class SomeControllerTest {

    @Mock private RequestValidator reqValidator;
    @Mock private SomeService service;
    @InjectMocks private SomeController controller;

    private MockMvc mockMvc;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
        mockMvc = MockMvcBuilders.standaloneSetup(controller).build();
    }

    @Test
    public void testInquiry_success() throws Exception {
    when(service.inquiry(any(Request.class))).thenReturn(res);
    mockMvc.perform(get("/Inquiry")
            .param("email", "john.doe@gmail.com")
            .param("phoneNumber", "01189998819991197253")
            )
            .andExpect(status().isOk())
            .andExpect(content().string(res));
    }
}

上述测试进展顺利。但是,当我想测试负面情景时,我陷入困境,例如:其中一个字段是空的。测试似乎永远不会进入reqValidator.validate()方法。即使我把电子邮件和电话号码都空了。如何测试负面情景?如何让我的测试进入验证?

下面是我的自定义验证类,它实现了spring的验证器。

@Component
public class RequestValidator implements Validator {

    // omitted to be concise

    @Override
    public void validate(Object o, Errors errors) {
        // validate something
    }
}

我希望我能很好地解释自己。 谢谢。

1 个答案:

答案 0 :(得分:0)

您的单元测试实际上从未调用过reqValidator.validate()方法,因为reqValidator.validate()是一种void方法。

在mockito中,mocks上的void方法默认不执行任何操作。如doNothing()文档中所述。如果要实际运行void方法,可以使用doCallRealMethod()