В настоящее время у меня есть приложение, созданное с использованием Spring Boot 2, Spring MVC, Spring Data / JPA и Thymeleaf.
Я пишу некоторые модульные / интеграционные тесты и хотел бы протестировать контроллер , который защищен SpringSecurity и базой данных с зарегистрированными пользователями.
Каков наилучший подход для проверки? Я безуспешно пытался использовать некоторые из них, например, использовать аннотации типа @WithMockUser
.
Редактировать: просто напоминание, что я не тестирую @RestController
с. Я напрямую внедряю @Controller
в свой тестовый класс и вызываю его методы. Он прекрасно работает без Spring Security.
Один пример:
@Controller
public class SecuredController {
@GetMapping("/")
public String index() {
return "index";
}
}
Путь /
защищен Spring Security и обычно перенаправляет на /login
для аутентификации пользователя.
Мой модульный тест выглядел бы так:
@WebMvcTest(controllers = SecuredController.class)
class SecuredControllerTest {
@Autowired
private SecuredController controller;
@Autowired
private MockMvc mockMvc;
@Test
@WithMockUser(username = "user", password = "pass", roles = {"USER"})
public void testAuthenticatedIndex() throws Exception {
mockMvc.perform(get("/"))
.andExpect(status().isOk())
.andDo(print());
}
}
Первая ошибка, которую я получаю, это то, что меня просят ввести мою реализацию UserDetailsService, чего я бы хотел избежать. Но если я внедряю сервис, тест работает, но возвращает 404 вместо 200.
Есть идеи?