我正在尝试为我的弹簧控制器编写测试并遇到问题。以下代码始终返回redirect:/welcome
,但我when(result.hasErrors()).thenReturn(true);
应返回add
。可能是我做错了什么。请帮我解决这个问题。
控制器
@Controller
public class SpringController {
@Autowired
private UserService userService;
@Autowired
private CorrectValidator correctValidator;
@Autowired
private ExistValidator existValidator;
@Autowired
private Unwrapper unwrapper;
@RequestMapping(value = "/create", method = RequestMethod.POST)
public String create (Wrapper wrapper,
BindingResult result)
throws ParseException {
correctValidator.validate(wrapper, result);
existValidator.validate(wrapper, result);
if (result.hasErrors()) {
return "add";
}
userService.create(unwrapper.unwrap(wrapper));
return "redirect:/welcome";
}
}
测试
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(locations={"file:src/main/webapp/WEB-INF/spring-servlet.xml"})
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class})
public class ControllerTest {
@InjectMocks
private SpringController controller;
@Mock
private Wrapper wrapper;
@Mock
private BindingResult result;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
mockMvc = standaloneSetup(controller)
.setSingleView(mockView)
.build();
}
@Test
public void testCreateBad() throws Exception {
when(result.hasErrors()).thenReturn(true);
mockMvc.perform(post("/create", wrapper, result))
.andExpect(status().isOk())
.andExpect(view().name("add"));
}
}
答案 0 :(得分:2)
问题是您没有正确使用post()
方法。 See the javadoc here
在您传递的参数中
post("/create", wrapper, result)
wrapper
和result
用作url变量,而不是create
方法的方法参数。你不能以这种方式嘲笑BindingResult
。这实际上非常难以模仿它,从长远来看可能不值得。如果有任何问题,你应该使用命令对象来测试它们是否有效。