我尝试为一个简单的spring-boot控制器创建我的第一个测试,但是得到了Handler: Type = null。在浏览器中,代码有效,但测试失败。我的应用程序使用spring-security。请帮助我解决问题并了解我的错误。谢谢。
Handler: Type = null
这是控制器:
private final ItemService service; @GetMapping("/get_all_items") public String getAllItems(Model model) { model.addAttribute("items", service.getAll()); return "all_items"; }
这是一个测试。
@RunWith(SpringRunner.class) @WebMvcTest(ItemController.class) public class ItemControllerTest { @Autowired private MockMvc mvc; @MockBean private ItemService itemService; @Test @WithMockUser(username = "user", roles = "user")//mock security. public void whenGetAllItemsThenControllerReturnAllItems() throws Exception { given( itemService.getAll() ).willReturn( new ArrayList<Item>() ); mvc.perform( get("/get_all_items").accept(MediaType.TEXT_HTML) ).andExpect( status().isOk() ); } }
这是结果日志:
MockHttpServletRequest:HTTP方法= GET请求URI = / get_all_items参数= {}标头= {Accept = [text / html]} 处理程序:类型= null 异步:异步开始=假异步结果=空 解决的异常:类型= null ModelAndView:视图名称= null视图= null模型= null FlashMap:属性= null MockHttpServletResponse:状态= 403错误消息=访问被拒绝标头= {X-Content-Type-Options = [nosniff],X-XSS-Protection = [1; 模式=块],缓存控制= [无缓存,无存储,最大年龄= 0,必须重新验证],语料= [无缓存],到期时间= [0],X帧选项= [ DENY],Strict-Transport-Security = [max-age = 31536000; includeSubDomains]}内容类型= null正文=转发的URL = null重定向的URL = null Cookies = [] java.lang.AssertionError:预期状态:200实际:403
MockHttpServletRequest:HTTP方法= GET请求URI = / get_all_items参数= {}标头= {Accept = [text / html]}
处理程序:类型= null
异步:异步开始=假异步结果=空
解决的异常:类型= null
ModelAndView:视图名称= null视图= null模型= null
FlashMap:属性= null
MockHttpServletResponse:状态= 403错误消息=访问被拒绝标头= {X-Content-Type-Options = [nosniff],X-XSS-Protection = [1; 模式=块],缓存控制= [无缓存,无存储,最大年龄= 0,必须重新验证],语料= [无缓存],到期时间= [0],X帧选项= [ DENY],Strict-Transport-Security = [max-age = 31536000; includeSubDomains]}内容类型= null正文=转发的URL = null重定向的URL = null Cookies = []
java.lang.AssertionError:预期状态:200实际:403
解决的办法是 导入 的@Configuration类的spring安全配置,除了声明@WebMvcTest(ItemController.class)像这样@Import(SecurityConfig.class)(假设你的自定义配置为Spring Security是在一个名为类SecurityConfig)。
@Configuration
@WebMvcTest(ItemController.class)
@Import(SecurityConfig.class)
SecurityConfig
您可能还会发现Spring Boot的问题跟踪器中的讨论也很有帮助:https : //github.com/spring-projects/spring- boot/issues/6514