4 votes

Mapper le jeu de résultats en objet Java (POJO) puis comparer la réponse réelle, c'est-à-dire déjà convertie en objet Java (POJO)

Comment mapper un ensemble de résultats vers un objet Java (POJO) puis le comparer avec la réponse réelle, c'est-à-dire déjà convertie en objet Java (POJO)

Le principal problème auquel je suis confronté est que le type de colonne SQL est différent du POJO. Par exemple : les informations marketing avec la réponse ci-dessous créeront un POJO séparé, mais dans la base de données, elles sont mappées en tant que chaîne.

Existe-t-il un moyen de créer une fonction générique pour valider l'ensemble de résultats de la base de données par rapport à la réponse réelle pour chaque point de terminaison ?

Réponse de l'API ci-dessous :

{
    "uuid": "00a26ea4-6be3-47dd-8ee6-2f52a71d98b6",
    "email": "pulkit.agrawal+4353746031@gmail.com",
    "firstName": "Pulkit",
    "lastName": "Agrawal",
    "businessName": "MMIS Test 1709386721967",
    "phoneNumber": "4029559455",
    "marketingInfo": {
        "utm_campaign": "Commerce_WhereToBuy"
    },
    "resellerUuid": "47HMNNZ9BPF8E",
    "order": {
        "uuid": "366ae541-899b-420a-9112-0897406bf7ae",
        "hasSubscriptions": false,
        "planId": "4NKNCTE5RGV5P",
        "planName": "Counter Service Restaurant",
        "keyedInRate": {
            "percentage": 3.5,
            "fixedAmount": {
                "value": 0.20,
                "currencyCode": "USD"
            }
        },
        "inPersonRate": {
            "percentage": 2.3,
            "fixedAmount": {
                "value": 0.10,
                "currencyCode": "USD"
            }
        },
        "shippingAddress": {
            "lineOne": "131 Varick St",
            "lineTwo": "11",
            "city": "New York",
            "state": "NY",
            "zipCode": "10014"
        },
        "items": [
            {
                "uuid": "64e2172d-bd99-4dcc-8f04-b39d24f64614",
                "fdmpId": "777-1000108721",
                "displayName": "Flex",
                "purchaseType": "P",
                "quantity": 1,
                "price": {
                    "value": 599.00,
                    "currencyCode": "USD"
                },
                "digitalCatalogId": "FLEX_GEN_3"
            },
            {
                "uuid": "ff873f43-09d6-4fd6-9613-78703e1b1b19",
                "fdmpId": "93183",
                "displayName": "Station Solo",
                "purchaseType": "P",
                "quantity": 1,
                "price": {
                    "value": 1699.00,
                    "currencyCode": "USD"
                },
                "digitalCatalogId": "STATION_SOLO_CASH_DRAWER"
            }
        ]
    },
    "salesforceId": "00Q8J000001uPewUAE",
    "salesforceOwnerId": "00G7j000001EdZdEAK",
    "chainAgentId": "526975216882",
    "clAnalyticsId": "d356c4dec6af56976d667364b3f41b6e779dde2aaf027edf9cfe74cf288505f0",
    "modifiedTime": "2024-03-02T13:38:43.908+00:00"
}

Résultats SQL ci-dessous : Description de l'image ici Description de l'image ici

Code que j'essaie :

public class SubmitApp extends BaseTest {

@Test
public void shouldBeAbleToCreateLead() throws SQLException, ClassNotFoundException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
    Lead requestCreateLead = leadBuilder();
    Response response = LeadAPI.put(requestCreateLead);
    assertThat(response.statusCode(), equalTo(StatusCode.CODE_200.getCode()));
    LeadResponse actualResponseLead = response.as(LeadResponse.class);

    ResultSet rs = dbConnection();
    List responseList = convertSQLResultSetToObject(rs, LeadResponse.class);
}

public static <T> List<T> convertSQLResultSetToObject(ResultSet resultSet, Class<T> clazz) throws SQLException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
    Field[] fields = clazz.getDeclaredFields();
    for (Field field : fields) {
        field.setAccessible(true);
    }
    List<T> list = new ArrayList<>();
    while (resultSet.next()) {

        T dto = clazz.getConstructor().newInstance();

        for (Field field : fields) {
            String name = field.getName();

            try {
                String value = resultSet.getString(name);
                field.set(dto, field.getType().getConstructor(String.class).newInstance(value));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        list.add(dto);
    }
    return list;
}

@Step
public Lead leadBuilder() {
    Lead lead = new Lead();
    return lead;
}

Erreur rencontrée dans la dernière ligne :

java.lang.NoSuchMethodException: com.spotify.oauth2.pojo.LeadResponse.MarketingInfo.(java.lang.String)

N.B : Lien Github pour le code : Dépôt GitHub Rest Assured

2voto

TEH EMPRAH Points 832

L'exception est assez simple - certains de vos types de champ dans un DTO manquent du constructeur String, notamment "MarketingInfo"

De plus, le code que vous avez pris n'est pas destiné à peupler les objets imbriqués par défaut, vous devriez envisager un ORM ou vos propres factories.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X