Java 如何为SpringMVC端点创建一个单元测试,该端点包含一个包含JSON字符串的必需请求参数?

Java 如何为SpringMVC端点创建一个单元测试,该端点包含一个包含JSON字符串的必需请求参数?,java,spring,unit-testing,Java,Spring,Unit Testing,我知道使用包含JSON字符串的请求参数不是一个好做法,但我继承了这段代码 因此,我现在必须与它合作 我正在尝试创建一个单元测试来测试此端点,但item request参数有问题: 控制器代码段是: @RequestMapping(value = "/item/{idtype}:{id}/details", method = RequestMethod.GET, produces="application/json; charset=UTF-8") @Api

我知道使用包含JSON字符串的请求参数不是一个好做法,但我继承了这段代码 因此,我现在必须与它合作

我正在尝试创建一个单元测试来测试此端点,但item request参数有问题:

控制器代码段是:

    @RequestMapping(value = "/item/{idtype}:{id}/details",
            method = RequestMethod.GET, produces="application/json; charset=UTF-8")
    @ApiOperation(value = "",
            response = ItemDTO.class, responseContainer = "List")
    @ApiImplicitParams({@ApiImplicitParam(name = "Authorization", value = "Authorization token",
            required = false, dataType = "string", paramType = "header")})
    public Collection<ItemDTO> getItemDetailList(@PathVariable("idtype") String idType, @PathVariable("id") String id,
                                                                   @RequestParam(value = "item", required = true) ItemDTO item {

   ...

   }
   ...
    @InitBinder("item")
    public void initBinder(WebDataBinder binder) {
        binder.registerCustomEditor(ItemDTO.class, new StringArrayPropertyEditor(null));
    }
@RequestMapping(value=“/item/{idtype}:{id}/details”,
method=RequestMethod.GET,products=“application/json;charset=UTF-8”)
@API操作(值=”,
response=ItemDTO.class,responseContainer=“List”)
@apimplicitparams({@apimplicitparam(name=“Authorization”,value=“Authorization token”,
required=false,dataType=“string”,paramType=“header”)})
公共集合getItemDetailList(@PathVariable(“idtype”)字符串idtype,@PathVariable(“id”)字符串id,
@RequestParam(value=“item”,required=true)ItemDTO item{
...
}
...
@初始活页夹(“项目”)
公共绑定器(WebDataBinder绑定器){
binder.registerCustomEditor(ItemDTO.class,新StringArrayPropertyEditor(null));
}
绑定器用于将在item参数中传递的JSON字符串转换为ItemDTO java对象

单元测试代码段是:

    @RequestMapping(value = "/item/{idtype}:{id}/details",
            method = RequestMethod.GET, produces="application/json; charset=UTF-8")
    @ApiOperation(value = "",
            response = ItemDTO.class, responseContainer = "List")
    @ApiImplicitParams({@ApiImplicitParam(name = "Authorization", value = "Authorization token",
            required = false, dataType = "string", paramType = "header")})
    public Collection<ItemDTO> getItemDetailList(@PathVariable("idtype") String idType, @PathVariable("id") String id,
                                                                   @RequestParam(value = "item", required = true) ItemDTO item {

   ...

   }
   ...
    @InitBinder("item")
    public void initBinder(WebDataBinder binder) {
        binder.registerCustomEditor(ItemDTO.class, new StringArrayPropertyEditor(null));
    }
私有MockMvc

@Before
public void setUp() throws Exception {
    MockitoAnnotations.initMocks(this);
    mvc = MockMvcBuilders.standaloneSetup(ItemDetailsController).build();
}
...
StringBuilder stringBuilder = new StringBuilder("/v2/item/").append("type").append(":").append("1234")
    .append("/details");
Map<String, String> value = new HashMap<>();
value.put("value", "{\"itemId\":\"test\"}");
URI uri = new URI(stringBuilder.toString());
UriComponents uriComponents = UriComponentsBuilder.fromUri(uri).query("item={value}").buildAndExpand(value);
mvc.perform(MockMvcRequestBuilders.get(uriComponents.toUri())
    .contentType(MediaType.APPLICATION_JSON_VALUE))
    .andExpect(MockMvcResultMatchers.status().isOk()
@之前
public void setUp()引发异常{
initMocks(this);
mvc=MockMvcBuilders.standaloneSetup(ItemDetailsController.build();
}
...
StringBuilder StringBuilder=new StringBuilder(“/v2/item/”)。追加(“类型”)。追加(“:”)。追加(“1234”)
.附加(“/详细信息”);
Map value=newhashmap();
value.put(“value”,“itemId:\”test\“}”);
URI=新URI(stringBuilder.toString());
UriComponents UriComponents=UriComponentsBuilder.fromUri(uri).query(“项={值}”).buildAndExpand(值);
perform(MockMvcRequestBuilders.get(uriComponents.toUri())
.contentType(MediaType.APPLICATION\u JSON\u值))
.andExpect(MockMvcResultMatchers.status().isOk())
当我运行单元测试时,我得到一个异常:

java.lang.IllegalStateException:无法将[java.lang.String]类型的值转换为所需类型[biz.dto.ItemDTO]:找不到匹配的编辑器或转换策略

我尝试过其他排列和组合,例如使用.param方法链接到mvc的.perform方法来添加项参数,或者只是简单地添加项 参数添加到Stringbuilder,但我没有成功。我也尝试过在论坛上搜索类似的问题,但也没有成功


如果有任何帮助,我们将不胜感激。

您的测试将一团糟


如果您想要测试绑定器-测试绑定器。(模拟测试)如果您想要测试控制器-测试它。(再次模拟测试)您想要的是完全集成测试,以查看绑定器被注释使用,然后解析字符串(json)对于这一点,我建议您重新启动或者做些什么

您可以发布ItemDTO吗?尝试更改为
.query(“item={}”)
并调用。我希望ItemDTO具有所有空属性