我正在尝试为我的控制器进行单元测试。 这是我想要测试的控制器的方法:
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
}
}
我希望我能很好地解释自己。 谢谢。
答案 0 :(得分:0)
您的单元测试实际上从未调用过reqValidator.validate()
方法,因为reqValidator.validate()
是一种void方法。
在mockito中,mocks上的void方法默认不执行任何操作。如doNothing()文档中所述。如果要实际运行void方法,可以使用doCallRealMethod()。