为什么spring test失败,@ MockBean不起作用

时间:2017-08-27 13:43:37

标签: java spring spring-mvc spring-boot spring-test-mvc

我尝试创建我的第一个简单的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

1 个答案:

答案 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