
مقدمة
تتمثل إحدى المهام الرئيسية لكل خدمة ويب في إعادة النموذج إلى جانب العميل ، وفي هذه الحالة ، يوفر
Spring Boot مستوى مناسب من التجريد ، مما يسمح للمطور بالبقاء على مستوى العمل مع الطرز ، وترك عملية تسلسل النموذج خارج شفرة مصدر البرنامج. ولكن ماذا لو أصبح التسلسل نفسه جزءًا من منطق عمل التطبيق وبالتالي يتطلب تغطية حالة الاختبار؟
في هذه المقالة ، سنأخذ بعين الاعتبار أحد السيناريوهات عندما نحتاج إلى مراعاة ميزات منطق العمل للتطبيق أثناء التسلسل (سيناريو تقريب المبالغ المالية) ، على سبيل المثال سنواجه آلية التسلسل في Spring Boot ، وكذلك وصف طريقة اختبار محتملة.
بيان المشكلة
دع خدمة الويب الخاصة بنا تكون مسؤولة عن توفير معلومات حول نفقات العملاء ، ونحن بحاجة إلى توفير البيانات بدقة قابلة للتكوين. يتمثل الحل المنطقي في إجراء جميع تحويلات النموذج إلى محيط الخدمة ، مع الاحتفاظ برؤية تطبيق منطق التقريب.
النظر في حل ممكن
تخيل وحدة تحكم تطبيقنا ، والتي سوف تعيد النموذج المطلوب.
@RestController public class AccountController {
الآن دعونا نلقي نظرة على نموذجنا.
public class Account { private Long clientId;
ربما كان عليك بالفعل التعامل مع التعليقات التوضيحية الأخرى للتخصيص. تتمثل ميزة هذا التعليق التوضيحي في القدرة على تحديد الخدمة المسؤولة عن إجراء تسلسل لحقل النموذج المشروح.
قبل أن ننظر إلى ما يدور حوله متسلسل ، سنقوم بتعقيد المهمة: دع تقريب المعلمات قابلاً للتكوين من خلال خدمة داخلية تلخص أي مظهر من مظاهر تحليل المعلمة الديناميكي.
هذا التعقيد هو النقطة الرئيسية التي نريد أن ننظر فيها. كما نرى من تطبيق النموذج ، تأخذ API الخاصة بإطار عملنا فئة التسلسل في الوسيطة ، مما يعني أن دورة حياة المسلسل تخضع لسيطرة إطار عمل التسلسل. هذا يطرح السؤال ، ماذا نفعل إذا أردنا حقن التبعية من سياق تطبيقنا في المسلسل؟ للقيام بذلك ، النظر في تنفيذ التسلسل أعلاه.
خدمتنا جاهزة ، لكن كمطورين مسؤولين ، نريد التأكد من أن المطبخ الذي قمنا بتجميعه يعمل.
دعنا ننتقل إلى الاختبار.
دعونا نرى ما يقدمه إطار عمل اختبار API.
دعونا نتناول هذه اللحظة بمزيد من التفصيل. يستخدم جاكسون فئة
ObjectMapper لتسلسل النماذج
وإلغاء تسلسلها. هذا هو بالضبط كائن السياق المسؤول عن تحويل النماذج ، لذلك ، للتأكد من كيفية تقديم النموذج ، ستحتاج إلى التحقق من كيفية معالجة ObjectMapper من السياق.
إذا كنت تريد إنشاء ObjectMapper المخصص الخاص بك ، فيمكنك العثور على المثال النموذجي التالي:
ObjectMapper mapper = new ObjectMapper . ومع ذلك ، انظر إلى كيفية قيام Spring Boot بإنشاء مثيل لهذه الفئة افتراضيًا. للقيام بذلك ، ننتقل إلى
رمز التكوين التلقائي لـ
JacksonAutoConfiguration الأصلي ، المسؤول عن إنشاء الكائن:
@Bean public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) { return builder.createXmlMapper(false).build(); }
وإذا ذهبنا إلى أبعد من ذلك ونظرنا إلى
build () ، وجدنا أنه بالنسبة للتسلسل ، والتي يمكننا التعود عليها عند العمل مع المخطط الافتراضي (مثل حقن الخدمات في مُسلسل مخصص) ، لا يكفي إنشاء مصمم Bean فحسب ، يجب عليك التوجه إلى المُنشئ المتوفر . بالمناسبة ، في
وثائق Spring Boot نفسها ، يتم توضيح ذلك صراحة.
مع استطراد ، أود أن أضيف إشارة إلى
JacksonTester . كممثل للقذيفة لاختبار تسلسل BDD في سياق Mockito.
لتلخيص
- يوفر Spring Boot القدرة على تخصيص تسلسل النموذج من خلال التعليقات التوضيحية JsonSerializer
- لاختبار التسلسل ، استخدم المخطط في نفس التكوين كما في التطبيق
- عند تخطي حبة من التكوين التلقائي لـ Spring Boot ، انتبه إلى كيفية إنشاء هذه الحبة Spring Boot نفسها ، حتى لا تفوت الفرص التي كانت لدى الحبة الافتراضية
- يمكنك استخدام التعليقات التوضيحية JsonTest لتحديد السياق المحدود المطلوب لاختبار التسلسل.
استنتاج
شكرا لاهتمامكم! سيكون هذا المثال ذا صلة بالإصدار الحالي من Spring Boot 2.1.x ، وكذلك للإصدارات السابقة التي تصل إلى 1.4.x. أيضا ، هذه التقنية مناسبة للحالات مع إلغاء تسلسل النموذج. انظر تحت غطاء الأطر الأساسية للحصول على فهم أفضل لآلية تشغيل التطبيق واتبع منهجية مسؤولة للاختبار.