当前位置: 首页 > 知识库问答 >
问题:

为什么spring测试失败,不工作@mockbean

慕光赫
2023-03-14

我尝试为一个简单的spring引导控制器创建第一个测试,但得到的是handler:Type=null。在浏览器中,代码是工作的,但测试失败。我的应用程序使用spring-安全。请帮助我解决问题,并理解我的错误。谢谢你。

这是控制器:

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参数={}Headers={accept=[text/html]}

处理程序:类型=空

异步:异步启动=false异步结果=null

已解决的异常:Type=null

modelandview:视图名称=null视图=null模型=null

FlashMap:Attributes=null

mockHttpServletResponse:状态=403错误消息=访问被拒绝标头={x-content-type-options=[nosniff],x-xss-protections=[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]}内容类型=

java.lang.AssertionError:预期状态:200实际:403

共有1个答案

崔涵亮
2023-03-14

这基本上是一个重复的问题,这里已经回答了:https://stackoverflow.com/a/38676144/388980

解决方案是为您的spring安全配置导入@configuration类,此外还要像下面这样声明@webmvctest(itemcontroller.class)(假设您的spring安全自定义配置在一个名为securityconfig的类中)。

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

另一个选择是禁用spring安全性,如这里所解释的:禁用使用spring boot的单元测试的安全性

 类似资料:
  • 从Spring 3.1开始,由于@Enable*注释,我们可以更容易地使用JavaConfig。 所以我做了一个WebConfig来设置WebMvc配置,并尝试对其进行测试。但是,如果我使用WebConfig扩展WebMVCConfigureAdapter或WebMvcConfigurationSupport,单元测试将失败,因为缺少ServletContext。代码和消息如下所示。 网络配置。J

  • 我只是按照spring的指示将响应发送回特定用户,而不是广播消息。但最终,无法发送回响应消息。 这是我的js代码: 这是控制器: 这是Spring配置: 请帮忙。谢谢提前。 我已经尝试使用@SendToUser,@SendToUser(/队列/resp)和SimpMessagingTem板以及,完全不能响应消息到浏览器。

  • 我有一个2分钟的Selenium webdriver脚本。它与FirefoxDriver和ChromeDriver配合使用效果非常好。真正的浏览器永远不会失败。 但是当我用HTMLUnit驱动程序运行时,我发现它随机失败。抛出异常,如找不到元素。 我尝试过的解决方案: 添加线程。睡眠至6000毫秒,但仍不能每次跑步 配置和版本: 硒-java: 2.53.0 selenium服务器:2.53.0

  • 我有一个带有Java配置类的Spring(4.2.5)项目。这些在正常运行项目时起作用,但我无法使我的测试工作。在下面的测试中,为空。 如果添加注释,则会出现异常 其中和在和中定义,后者是基于活动配置文件选择的。 [编辑2] 经过更多的搜索,我发现了这个问题,并且在检查了我的依赖项之后,我发现我在maven依赖项下有Spring-Core-4.1.9,而且我没有在我的POM中包含一个依赖项。添加依

  • 我正试图解决同设计街机的挑战,几乎一直在增加序列。 任务是找出是否可以通过移除不超过一个元素来得到一个严格递增的序列。 我的代码通过了19个测试用例中的17个。我明白为什么其中一个测试用例失败了。不过,我不明白为什么这次失败了: 输入:序列:[3,5,67,98,3]输出:false预期输出:true控制台输出:“计数器:4” 我不明白,为什么它返回计数器=4。