小编典典

为什么Spring测试失败了,所以无法使用@MockBean

spring-boot

我尝试为一个简单的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]}

处理程序:类型= 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


阅读 947

收藏
2020-05-30

共1个答案

小编典典

解决的办法是 导入
@Configuration类的spring安全配置,除了声明@WebMvcTest(ItemController.class)像这样@Import(SecurityConfig.class)(假设你的自定义配置为Spring
Security是在一个名为类SecurityConfig)。

您可能还会发现Spring Boot的问题跟踪器中的讨论也很有帮助:https : //github.com/spring-projects/spring-
boot/issues/6514

2020-05-30