البرمجة

كيفية تحويل مخرجات JSONPath إلى أنواع بيانات معينة

لقد قمت بتحديد ObjectMapper لديك لاستخدام Longs بدلاً من الأرقام الصحيحة عند تحويل JSON إلى كائن Java. ومع ذلك، يبدو أن هذا الإعداد لم يؤثر على نتيجة .andExpect(jsonPath("$[1].parent_id",is(this.transactions.get(1).getParentId()))) في اختبارك.

السبب في ذلك هو أن .andExpect(jsonPath("$[1].parent_id") يستخدم ObjectMapper مختلفًا مما تستخدمه في RestController الخاص بك. بدلاً من ذلك، يعتمد على المكتبة JSONPath التي لا تستخدم ObjectMapper الخاص بك بل تستخدم بداخلها.

لحل هذه المشكلة، يمكنك تحويل القيمة المرجعية ليتوافق مع النوع المتوقع. في حالتك، يمكنك تحويلها إلى Long قبل المقارنة. يمكنك فعل ذلك بتغيير الجزء النهائي من اختبارك ليبدو كالتالي:

java
.andExpect(jsonPath("$[1].parent_id",is(this.transactions.get(1).getParentId().intValue())));

بهذا التغيير، سيتم تحويل القيمة المرجعية إلى int، مما يجعل المقارنة تعمل بشكل صحيح.

المزيد من المعلومات

في الكود الذي قمت بتوفيره، يتم تعيين القيم الافتراضية للمحاكي MockMvc في الدالة setup() قبل تشغيل كل اختبار. يتم استخدام هذا المحاكي لاختبار الواجهة الخاصة بك. تمثل قيم الاختبار في قائمة transactions كائنات Transaction. عند استدعاء الدالة get(1).getParentId()، يتم استدعاء القيمة المتوقعة لـ parentId، التي تكون Long.

تحتوي الاستجابة التي يتم الحصول عليها من الطلب GET “/transaction/” في الاختبار على كائن JSON يحتوي على مصفوفة من كائنات Transaction. عند استخدام jsonPath("$[1].parent_id")، يتم استرداد قيمة parentId الموجودة في العنصر الثاني في المصفوفة، والتي يجب أن تكون من النوع int.

من الواضح من النتيجة الخاطئة للاختبار أن القيمة التي يتم استردادها من الاستجابة هي int، في حين أن قيمة parentId المتوقعة هي Long. لحل هذه المشكلة، يجب تحويل القيمة التي يتم استردادها من الاستجابة إلى int قبل المقارنة.

وفيما يلي طريقة لتحقيق ذلك باستخدام intValue() لتحويل القيمة المرجعية إلى int:

java
.andExpect(jsonPath("$[1].parent_id", is(this.transactions.get(1).getParentId().intValue())));

بهذا التغيير، يجب أن تنتهي المقارنة بنجاح مع تحويل القيمة المسترجعة إلى int.

زر الذهاب إلى الأعلى