我尝试创建我的第一个简单的spring-boot控制器的测试,但我得到Handler: Type = null
。在浏览器代码中工作但测试失败。我的应用程序使用spring-security。请帮我解决一个问题并理解我的错误。谢谢。
这是控制器:
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]}
处理程序: Type = null
异步: 异步启动= false 异步结果= null
已解决的异常: Type = null
的ModelAndView: 查看名称= null View = null Model = null
FlashMap: Attributes = null
MockHttpServletResponse: 状态= 403 错误消息=拒绝访问 标题= {X-Content-Type-Options = [nosniff],X-XSS-Protection = [1; mode = block],Cache-Control = [no-cache,no-store, max-age = 0,must-revalidate],Pragma = [no-cache],Expires = [0], X-Frame-Options = [DENY],Strict-Transport-Security = [max-age = 31536000; includeSubDomains]} 内容类型= null 身体= 转发的URL = null重定向的URL = null Cookies = []
java.lang.AssertionError:预期状态:200实际:403
答案 0 :(得分:2)
这实际上是一个重复的问题,已在此处回答:https://stackoverflow.com/a/38676144/388980
解决方案是导入您的Spring Security配置的@Configuration
类除了声明@WebMvcTest(ItemController.class)
之外@Import(SecurityConfig.class)
(假设您的Spring自定义配置)安全性位于名为SecurityConfig
)的类中。
您可能还会发现Spring Boot问题跟踪器中的讨论也很有用:https://github.com/spring-projects/spring-boot/issues/6514
另一个选项是禁用 Spring Security,如下所述:Disable security for unit tests with spring boot