【发布时间】:2018-01-22 14:09:29
【问题描述】:
我目前正在使用 Jackson 的反序列化功能,但遇到了一个问题,我不知道如何解决。
在我的测试过程中,@JsonProperty(access = JsonProperty.Access.WRITE_ONLY) 注释被忽略,它只显示null。
但是,例如邮递员一切正常。
我只使用带有 Web Starter 和 Test Starter 依赖项的 Spring Boot Starter。
示例代码:
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
@RestController
class JacksonExampleRestController {
@PostMapping("/api")
public void getResti(@RequestBody JacksonModel jacksonModel) {
System.out.println(jacksonModel.getId());
System.out.println(jacksonModel.getPassword());
}
}
class JacksonModel {
private String id;
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private String password;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
测试:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = DemoApplication.class)
public class DemoApplicationTests {
private MockMvc mockMvc;
@Before
public void setUp() {
JacksonExampleRestController jacksonExampleRestController = new JacksonExampleRestController();
mockMvc = MockMvcBuilders.standaloneSetup(jacksonExampleRestController)
.build();
}
@Test
public void testJackson() throws Exception {
JacksonModel jacksonModel = new JacksonModel();
jacksonModel.setId("id");
jacksonModel.setPassword("password");
mockMvc.perform(post("/api").
contentType(APPLICATION_JSON_UTF8)
.content(convertObjectToJsonBytes(jacksonModel)));
}
public static byte[] convertObjectToJsonBytes(Object object)
throws IOException {
ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
return mapper.writeValueAsBytes(object);
}
}
这是默认行为吗?是我必须在测试中配置一些东西还是我现在看不到的其他东西?
【问题讨论】:
-
在不运行代码的情况下,我的第一反应是查看您使用 Jackson 使用被测对象生成 JSON 字节的事实。可能会打印出
convertObjectToJsonBytes返回的值并检查json字符串是否正常? -
在检查方法时,它只返回 Id。所以我添加了
mapper.configure(MapperFeature.USE_ANNOTATIONS, false);并且它有效......这干净吗?因为感觉不对…… -
我会继续使用 HashMap 来生成 JSON。因此,如果您考虑一下,您正在测试的是端点。访问此端点的人不会使用您的模型对象,那么为什么要在测试中使用它们呢?我知道这很方便,但不使用相同的对象来生成请求可能更安全。
标签: java rest testing spring-boot jackson