jackson JSON异常:测试中无法解析的JSON字符串

7vux5j2d  于 2023-03-23  发布在  其他
关注(0)|答案(3)|浏览(165)

我在做下一个测试

@WebMvcTest(TuCasitaController.class)
class TuCasitaControllerTest {

    @Autowired
    private MockMvc mvc;

    @MockBean
    private TuCasitaService tuCasitaService;

    ObjectMapper objectMapper;

    @BeforeEach
    void setUp() {
        objectMapper = new ObjectMapper();
    }

    @Test
    public void testGetInfoHouse() throws Exception {
        /* Given */
        objectMapper.configure(SerializationFeature.WRAP_ROOT_VALUE, false);
        ObjectWriter ow = objectMapper.writer().withDefaultPrettyPrinter();
        String houseCorrect = ow.writeValueAsString(InfoTestGenerator.generatesCorrectTestInfo());
        String expected = ow.writeValueAsString(InfoTestGenerator.generateValidResponse());
        System.out.println(expected);
        /* When */
        mvc.perform(post("/info")
                .contentType(MediaType.APPLICATION_JSON)
                .content(houseCorrect))
        /* Then */
                .andExpect(status().isOk())
                .andExpect(content().json(expected));
    }
}

但是它在.andExpect(content().json(expected))行抛出一个org.json.JSONException“Unparsable JSON string”。

public static Response generateValidResponse(){

    RoomArea room1 = RoomArea.builder().roomName("Recamara Principal").area(25).build();
    RoomArea room2 = RoomArea.builder().roomName("Recamara Daniel").area(28).build();
    RoomArea room3 = RoomArea.builder().roomName("Recamara Julieta").area(25).build();
    RoomArea room4 = RoomArea.builder().roomName("Sala").area(100).build();
    RoomArea room5 = RoomArea.builder().roomName("Comedor").area(16).build();
    RoomArea room6 = RoomArea.builder().roomName("Cocina").area(12).build();
    List<RoomArea> rooms = new ArrayList<>();
    rooms.add(room1);
    rooms.add(room2);
    rooms.add(room3);
    rooms.add(room4);
    rooms.add(room5);
    rooms.add(room6);

    return Response.builder()
            .nameHouse("Casa Familiar")
            .totalArea(206.0)
            .totalPrice(515000.0)
            .biggestRoom(RoomDTO.builder()
                    .roomName("Sala")
                    .roomWidth(10)
                    .roomLength(10)
                    .build())
            .roomAreas(rooms)
            .build();
}

当我在objectWriter之后打印它时,它看起来像这样:

{
  "nameHouse" : "Casa Familiar",
  "totalArea" : 206.0,
  "totalPrice" : 515000.0,
  "biggestRoom" : {
    "roomName" : "Sala",
    "roomWidth" : 10.0,
    "roomLength" : 10.0
  },
  "roomAreas" : [ {
    "roomName" : "Recamara Principal",
    "area" : 25.0
  }, {
    "roomName" : "Recamara Daniel",
    "area" : 28.0
  }, {
    "roomName" : "Recamara Julieta",
    "area" : 25.0
  }, {
    "roomName" : "Sala",
    "area" : 100.0
  }, {
    "roomName" : "Comedor",
    "area" : 16.0
  }, {
    "roomName" : "Cocina",
    "area" : 12.0
  } ]
}

有人知道我为什么会有这个问题吗?

rur96b6h

rur96b6h1#

JSON解析可能会受到withDefaultPrettyPrinter()的影响。请尝试不使用withDefaultPrettyPrinter()

uqjltbpv

uqjltbpv2#

使用:@SpringBootTest @AutoConfigureMockMvc
而不是:@WebMvcTest(TuCasitaController.class)解决了它。

oyjwcjzk

oyjwcjzk3#

这可能是因为你没有正确地模拟你的服务方法。你必须模拟服务才能让它工作。
示例:
Mockito.when(fooService.foo(fooString)).thenReturn(fooReturn);

相关问题