Java 如何使用预期的DTO测试控制器返回的JSON?

Java 如何使用预期的DTO测试控制器返回的JSON?,java,spring,testing,spring-test,Java,Spring,Testing,Spring Test,我使用spring test 5.0.7并进入下一期: DTO: 控制器: @RestController @RequestMapping("/api") public static class TestController { @GetMapping(path = "/dto/{uid}", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public SomeDTO findSomeObject(@PathVariable

我使用spring test 5.0.7并进入下一期:

DTO:

控制器:

@RestController
@RequestMapping("/api")
public static class TestController {
    @GetMapping(path = "/dto/{uid}", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    public SomeDTO findSomeObject(@PathVariable String uid) {
        return new SomeDTO(uid, new AnotherDTO("value"));
    }
}
还有一个失败的测试:

@Test
public void testControllerResult() throws Exception {
    SomeDTO dto = new SomeDTO(UUID.randomUUID().toString(), new AnotherDTO("value"));

    mockMvc.perform(MockMvcRequestBuilders.get("/api/dto/{uid}", dto.getUid()))
            .andExpect(MockMvcResultMatchers.status().isOk())
            .andExpect(MockMvcResultMatchers.jsonPath("$").value(dto));
}
测试日志:

java.lang.AssertionError: JSON path "$" 
Expected :TestTest.SomeDTO(uid=7817869a-eb9a-4491-a34b-a8006a643b6c, child=TestTest.AnotherDTO(someField=value))
Actual   :null

是否有任何方法可以在不指定字段类型的情况下使其正常工作
SomeDTO.child
?我猜它不起作用,因为
SomeDTO
没有提供关于字段
子项的信息(只要我将它设置为
私有的另一个子项,测试就会通过),但它可以在运行时计算。

为什么不验证
另一个子项中的字段而不是完整的对象?@Deadpool,只是为了方便起见,不管怎样,可能会有一个更复杂的模型存在相同的问题,在更糟糕的情况下,我们将不得不逐字段比较结果。你能至少用堆栈跟踪显示错误消息吗?我只是问你是否擅长比较完整的json字符串而不是
dto
?@Deadpool,是的,这可能是一种解决方法,但比较对象只是一种更好的方法,因为如果只在一个测试中验证json,并且json已更改,则只需要修复此测试,但是如果在每个控制器测试中比较json,并且json已更改,则需要修复所有测试中的预期json。UPD:我想我有一个更好的解决方法:我可以尝试将预期的DTO转换为JSON字符串,并将字符串与结果进行比较。谢谢
java.lang.AssertionError: JSON path "$" 
Expected :TestTest.SomeDTO(uid=7817869a-eb9a-4491-a34b-a8006a643b6c, child=TestTest.AnotherDTO(someField=value))
Actual   :null