test restassured log how examples example assured java jackson rest-assured

restassured - java.lang.ClassCastException: java.util.LinkedHashMap no se puede enviar a com.testing.models.Account



restassured maven example (5)

Me aparece el siguiente error:

java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.testing.models.Account

con el siguiente código

final int expectedId = 1; Test newTest = create(); int expectedResponseCode = Response.SC_OK; ArrayList<Account> account = given().when().expect().statusCode(expectedResponseCode) .get("accounts/" + newTest.id() + "/users") .as(ArrayList.class); assertThat(account.get(0).getId()).isEqualTo(expectedId);

¿Hay alguna razón por la que no puedo get(0) ?


El problema viene de Jackson. Cuando no tiene suficiente información sobre qué clase deserializar, utiliza LinkedHashMap .

Dado que no está informando a Jackson sobre el tipo de elemento de su ArrayList , no sabe que desea deserializarse en una ArrayList of Account s. Entonces vuelve a los valores predeterminados.

En cambio, probablemente podría usar as(JsonNode.class) , y luego tratar con ObjectMapper de una manera más rica de lo que permite estar seguro. Algo como esto:

ObjectMapper mapper = new ObjectMapper(); JsonNode accounts = given().when().expect().statusCode(expectedResponseCode) .get("accounts/" + newClub.getOwner().getCustId() + "/clubs") .as(JsonNode.class); //Jackson''s use of generics here are completely unsafe, but that''s another issue List<Account> accountList = mapper.convertValue( accounts, new TypeReference<List<Account>>(){} ); assertThat(accountList.get(0).getId()).isEqualTo(expectedId);


Intenta lo siguiente:

POJO pojo = mapper.convertValue(singleObject, POJO.class);

o:

List<POJO> pojos = mapper.convertValue( listOfObjects, new TypeReference<List<POJO>>() { });

Consulte la conversión de LinkedHashMap para obtener más información.


La forma en que pude mitigar el problema de la matriz JSON para la colección de objetos LinkedHashMap fue mediante el uso de CollectionType lugar de TypeReference . Esto es lo que hice y trabajé :

public <T> List<T> jsonArrayToObjectList(String json, Class<T> tClass) throws IOException { ObjectMapper mapper = new ObjectMapper(); CollectionType listType = mapper.getTypeFactory().constructCollectionType(ArrayList.class, tClass); List<T> ts = mapper.readValue(json, listType); LOGGER.debug("class name: {}", ts.get(0).getClass().getName()); return ts; }

Usando TypeReference , todavía TypeReference una ArrayList de LinkedHashMaps, es decir , no funciona :

public <T> List<T> jsonArrayToObjectList(String json, Class<T> tClass) throws IOException { ObjectMapper mapper = new ObjectMapper(); List<T> ts = mapper.readValue(json, new TypeReference<List<T>>(){}); LOGGER.debug("class name: {}", ts.get(0).getClass().getName()); return ts; }


Tengo este método para deserializar un XML y convertir el tipo:

public <T> Object deserialize(String xml, Class objClass ,TypeReference<T> typeReference ) throws IOException { XmlMapper xmlMapper = new XmlMapper(); Object obj = xmlMapper.readValue(xml,objClass); return xmlMapper.convertValue(obj,typeReference ); }

y esta es la llamada:

List<POJO> pojos = (List<POJO>) MyUtilClass.deserialize(xml, ArrayList.class,new TypeReference< List< POJO >>(){ });


Tuve una excepción similar (pero un problema diferente): java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to org.bson.Document , y afortunadamente se resuelve más fácilmente:

En lugar de

List<Document> docs = obj.get("documents"); Document doc = docs.get(0)

que da error en la segunda línea, se puede usar

List<Document> docs = obj.get("documents"); Document doc = new Document(docs.get(0));