Я тестирую контроллер с отображением POST.Вот выдержка:
@RequestMapping(path = "/bookForm", method = POST)
public String saveBook(@Valid @ModelAttribute(name = "book") BookCommand bookCommand,
BindingResult bindingResult) {
// blah blah
return "redirect:/books";
}
Я играю с безопасностью Spring, поэтому я написал тест, в котором я ожидаю, что некоторые из моих сопоставлений GET
будут отклонены для неавторизованного пользователя, но для этого метода POSTЯ хотел разрешить все.
Вот класс конфигурации теста:
@Configuration
public class SecurityTestConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/books/**").authenticated()
.antMatchers(HttpMethod.POST, "/bookForm").permitAll()
.and()
.httpBasic();
}
}
Дело в том, что mockMvc
по-прежнему возвращает 4xx для вызова POST.Почему это?
@RunWith(SpringRunner.class)
@WebMvcTest(controllers = BookController.class)
@Import(SecurityTestConfig.class)
public class BookControllerIT {
@Autowired
private MockMvc mockMvc;
// ... mocks ect
@Test // <- this is ok
public void shouldNotAllowBookUpdate() throws Exception {
mockMvc.perform(get("/books/1/update")).andExpect(status().is4xxClientError());
}
@Test // <- this fails
public void shouldAllowFormHandling() throws Exception {
mockMvc.perform(post("/bookForm")).andExpect(status().isOk());
}
}