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

模拟JSON数据以发送到Spring启动测试-自动绑定到@ModelAttribute

司徒寒
2023-03-14

我试图在Spring Bootendpoint上运行一个测试,accepts应该从客户端表单获取信息,将输入字段映射到DTO并将其持久化到DB中,但我无法让测试模式接受它。据我所知,当您有这样定义的控制器endpoint时:

@PostMapping(path = "/newContact")
public @ResponseBody ContactDTO createNewContact(
        @ModelAttribute ContactDTO newContact) { 
    //persists newContact to the data tier 
}

@ModelAtort标记会自动在传入的JSON名称中搜索newTouchDTO的字段名称,然后映射json值以填充DTO的字段。

这是我与班级的联系方式:

public class ContactDTO {

  private BigInteger userId;
  private BigInteger contactId;
  private String name;
  private String email;
  private String bday;
  private String address;
  private String city;
  private String state;
  private List<PhoneDTO> phones;
  private MultipartFile contactImgUpload;

   //getters and setters

}

首先,这是正确的理解吗?

因此,我试图通过生成预期的DTO,但将其转换为JSON,然后将该JSON发布到控制器endpoint来测试我的endpoint是否工作:

 @Autowired
  ObjectMapper objectMapper;

  @Test
  public void saveAnEntryWhenPOSTUserWithMultiplePhones() throws Exception {
    List<PhoneDTO> phones = new ArrayList<>();
    phones.add(new PhoneDTO("landline", "12312312312"));
    phones.add(new PhoneDTO("mobile", "3242523462"));

    ContactDTO cDTO = new ContactDTO();
    cDTO.setContactId(BigInteger.valueOf(555));
    cDTO.setName("Multiphone User");
    cDTO.setUserId(BigInteger.valueOf(123));
    cDTO.setEmail("test@email.com");
    cDTO.setBday("01/01/1987");
    cDTO.setState("IL");
    cDTO.setCity("Chicago");
    cDTO.setAddress("55 Jackson");
    cDTO.setPhones(phones);

    this.mockMvc.perform(post("/newContact")
            .contentType(MediaType.APPLICATION_JSON)
            .content(objectMapper.writeValueAsString(cDTO)))
            .andExpect(status().isOk())
            .andExpect(content().string(containsString("\"phoneType\":\"landline:\"")));
  }

但当我这样做时,它显然没有以预期的方式发送JSON,因为它在尝试保存到数据层时失败了,表示一些预期填充的预期字段(这里的“name”字段)是空的:

    org.springframework.web.util.NestedServletException: Request processing failed;
 nested exception is javax.validation.ConstraintViolationException: 
Validation failed for classes [app.models.relationentities.Contact] during
 persist time for groups [javax.validation.groups.Default, ]

    List of constraint violations:[

        ConstraintViolationImpl{interpolatedMessage='may not be null', 
propertyPath=name, rootBeanClass=class app.models.relationentities.Contact, messageTemplate='{javax.validation.constraints.NotNull.message}'}
    ]

那么,我的测试错了吗?如何模拟将填写好的表格发送到考试?

编辑包括phoneDTO,这是ContactDTO字段的私人列表

public class PhoneDTO {

  private String phoneType;
  private String number;
   //getters and setters
}

共有1个答案

施选
2023-03-14

使用flashAttr方法。

this.mockMvc.perform(post("/newContact")
        .contentType(APPLICATION_JSON)
        .flashAttr("newContact", cDTO))
        .andExpect(status().isOk())
        ...

控制器及其测试中也有不同的URL:newContact和users。

 类似资料:
  • 我是Opentelemetry领域的新手,希望将Spring-petclinic仪器数据发送给在我的远程云系统上运行的Jaeger 下面是bat文件: 当我运行bat文件,准备在浏览器(http://localhost:8080)中打开petclinic应用程序时,在控制台中出现以下错误: 如何解决这一问题?是否有其他依赖项要添加到petclinic pom.xml或代码中?

  • 未能配置Spring Boot进行集成测试。冷你请看一下下面的代码: 实体 存储 库 测试配置 应用程序属性 测试用例 我尝试了不同的配置(其最新版本),但一直出现相同的异常: 更奇怪的是,异常的本质是让spring boot根据实体注释自动生成模式。因此,在插入的时候,spring必须创建表,但是看起来它并没有创建。如果有人给我一个想法,我做错了什么,或者如果有人已经面临这样的问题-请让我知道。

  • 我正在使用 kafka 和 spring boot,我需要将 JSON 对象发送到 kafka,关键是我能够将一个对象作为配置 KafkaTemplate 的 JSON 发送,但仅适用于此对象。 但是如果现在我想发送一个新的DTO对象呢?我是否必须声明一个新的

  • 我的问题是关于测试多模块Spring Boot应用程序。 我有一个多模块spring boot REST应用程序。应用程序的结构如下: 以上就是我的应用程序的结构。 SpringBootMainApplication是主要项目。SpringbootModule是SpringBootMainApplication中的子项目。“SpringBootMainApplication.war”WAR将在WA

  • 我有以下课程: 应用和配置类 MyRestController类 我的实用类 当我启动应用程序并将其作为独立jar运行时,或者从IDE(Eclipse)运行时,没有任何问题,一切都按预期进行。 然而,我想写一个单元测试来测试我的MyRestController类。。。我得到了一个NPE,因为自动连接字段util为null(在MyRestController类中)。 这是我的测试课: 我肯定错过了一

  • const loadLibrary=useCallback(异步()= },[用户信息]; Spring code---@PostMap(value="/api/v1/user")public String createUser(@Request estParam("image")MultipartFile image){System.out.println(image);返回";} -错误--组