gpt4 book ai didi

java - mockMvc POST Junit 测试因 HttpMessageNotReadableException 失败

转载 作者:行者123 更新时间:2023-12-02 05:25:12 31 4
gpt4 key购买 nike

我正在尝试对我在 Controller 中创建的发布请求进行 JUNIT 测试。虽然 GET 成功,但 POST 不成功。

public class SampleObject implements Serializable {

private static final long serialVersionUID = 1L;
private String name;
public SampleObject(String name) {
this.name = name;
}
public String getName() {
return name;
}
}

发布请求示例

    @RequestMapping(value = "/post", method = RequestMethod.POST, produces="application/json", consumes="application/json")
@ResponseBody
public SampleObject postActiveSource(@RequestBody SampleObject inputObject) {
return inputObject;
}

这是我的模拟测试。

public class MockMvcHtmlUnitCreateMessageTest {


MockMvc mockMvc;

@InjectMocks
SampleController controller;

@Before
public void setup() {
MockitoAnnotations.initMocks(this);

this.mockMvc = standaloneSetup(controller)
.setMessageConverters(new MappingJackson2HttpMessageConverter()).build();
}

@Test
public void test() {

SampleObject so = controller.new SampleObject("abcd");
ObjectMapper mapper = new ObjectMapper();


try {
this.mockMvc.perform(post("/service/sample/post").content(mapper.writeValueAsString(so)).contentType(MediaType.APPLICATION_JSON).accept(MediaType.APPLICATION_JSON)).andDo(print());

} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}

我得到了这个异常。

Resolved Exception:
Type = org.springframework.http.converter.HttpMessageNotReadableException

但是,获取请求工作正常。这里出了什么问题?任何帮助将不胜感激。

编辑1:

我注意到以下异常。这可能会有所帮助。

nested exception is com.fasterxml.jackson.databind.JsonMappingException: No suitable constructor found for type [simple type, class com..rest.controller.SampleController$SampleObject]: can not instantiate from JSON object (need to add/enable type information?)
at [Source: org.springframework.mock.web.DelegatingServletInputStream@c792d4; line: 1, column: 2]

编辑2:

基于a suggestion below ,我修改了构造函数,

public SampleObject(@JsonProperty("name") String name) {
this.name = name;
}

但是,我遇到以下异常

Caused by: java.lang.IllegalArgumentException: Argument #0 of constructor [constructor for SampleController$SampleObject, annotations: [null]] has no property name annotation; must have name when multiple-paramater constructor annotated as Creator at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory.findValueInstantia‌​tor(BasicDeserializerFactory.java:287) ~[jackson-databind-2.3.4.jar:2.3.4] 

最佳答案

默认情况下,Jackson 期望 POJO 类有一个无参数构造函数。如果您需要有参数化构造函数,则需要对其参数进行注释。

public SampleObject(@JsonProperty("name") String name) {
this.name = name;
}

关于java - mockMvc POST Junit 测试因 HttpMessageNotReadableException 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26123040/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com