首页 > 解决方案 > java.lang.AssertionError:状态:404

问题描述

请有人帮我,我不知道是什么问题,我正在尝试对此方法进行测试,但它总是给我 java.lang.AssertionError: Status Expected :200 Actual :400

  @PutMapping("/infoUtile/update/{id}")
            public Map<String,Object> editActualite(@PathVariable Long id, @Valid @RequestParam ArrayList<Long> idDeleted,
                                                    @Valid @RequestParam String content, @Valid @RequestParam String description){
                InformationUtile info = this.infoUtileService.getInfoUtileById(id);

                    info.setContent(content);
                    info.setDescription(description);
                    info.setDate(new Date());

                if(idDeleted.size() != 0) {
                    for (int i = 0; i < idDeleted.size(); i++) {
                        this.mediaService.deleteMedia(idDeleted.get(i));
                    }
                }
                InformationUtile i = this.infoUtileService.addOrEditInfoUtile(info);
                return getInfoUtileWeb(i);
            }

这是我试图实施的测试

 @Test
    public void update() throws Exception {
        InformationUtile informationUtile = new InformationUtile();
        informationUtile.setId(1);
        informationUtile.setContent("oumaima");
        informationUtile.setDescription("test");
        Media medias = new Media();
        medias.setId(1);
        medias.setType("image/png");
        medias.setUrl("C:\\files\\actualite\\32769\\adobexd.png");
        List<Media> allMedias = new ArrayList<Media>();
        allMedias.add(medias);
        informationUtile.setMedias(allMedias);
        User user = new User();
        user.setId(1);
        user.setNom("oumaima");
        informationUtile.setUser(user);
        ArrayList<Long> idDeleted = new ArrayList<>();
        idDeleted.add(0L);
        Mockito.when(informationUtileService.getInfoUtileById(Mockito.<Long>any())).thenReturn(new InformationUtile());
        Mockito.when(informationUtileService.addOrEditInfoUtile(Mockito.any(InformationUtile .class))).thenReturn(informationUtile);
        mockMvc.perform(put("/infoUtile/update/{id}",informationUtile.getId()).requestAttr("idDeleted",idDeleted)
                .param("content",informationUtile.getContent())
                .param("description",informationUtile.getDescription())
       )
                .andExpect(status().isOk());
        verify(informationUtileService, times(1)).getInfoUtileById(informationUtile.getId());
        verify(informationUtileService, times(1)).addOrEditInfoUtile(informationUtile);
        verifyNoMoreInteractions(informationUtileService);
    }

标签: springjunitmockito

解决方案


您在端点定义了三个请求参数,@Valid @RequestParam ArrayList<Long> idDeleted, @Valid @RequestParam String content, @Valid @RequestParam String description这意味着它们是 url 之后的查询参数,例如http://localhost:8080/?idDeleted=1&idDeleted=2&content=Hello&description=Duke.

HTTP 404 表明 Spring 找不到您的请求的处理程序,这意味着客户端(在您的情况下MockMvc)具有格式错误的 URL。

在您当前的MockMvc请求设置中,您正在使用.requestAttr()请求idDeleted参数。

所有这些都应该是.param()

mockMvc
  .perform(put("/infoUtile/update/{id}",informationUtile.getId())
    .param("idDeleted", idDeletedOne , idDeletedTwo)
    .param("content",informationUtile.getContent())
    .param("description",informationUtile.getDescription())
  )

PS:我猜这里的@Valid注释是多余的/不需要的,因为您没有检查例如具有 Bean Validation 注释的有效负载来验证内容。

更新: .param()重载 with .parm(String name, String... values),因此您可以传递您的列表idDeletedwith.param("idDeleted", idDeletedOne, idDeletedTwo)或者您可以传递 aString[]并将您的所有Long值表示为 aString


推荐阅读