البرمجة

تخصيص تكوينات السياق لاختبارات Spring

عند اختبار تطبيق Spring Boot، يمكن أن يواجه المطور تحديات في إعداد بيئة الاختبار بشكل صحيح، خاصةً عندما يحتاج كل اختبار إلى تهيئة مختلفة من الحاويات والخدمات المزيفة أو المخصصة. في الحالة المذكورة، يبدو أن المطور يرغب في استخدام @ComponentScan للبحث عن المكونات والتكوينات، ومع ذلك يحتاج إلى تخصيص بعض الحاويات في اختبارات محددة. لذلك، هناك حاجة لإعدادات مختلفة لتلك الاختبارات مع الحفاظ على جزء كبير من البيئة الحقيقية.

لحل هذا، يمكننا استخدام تكوينات السياق المحلية داخل كل اختبار لتجاوز بعض تعريفات الحاويات الخاصة بالاختبار. يمكننا القيام بذلك عبر تعريف تكوينات داخل كل اختبار تعتمد على MyApplication وتعيين قيم مختلفة للحاويات التي نرغب في استخدامها في كل اختبار. هذا يسمح لنا بإنشاء بيئة اختبار مختلفة لكل اختبار دون التأثير على الاختبارات الأخرى.

بدايةً، سنحتاج إلى تعديل الاختبارات الحالية لتضمين تكوينات السياق المحلية:

java
@RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = MyApplication.class) @WebAppConfiguration @ActiveProfiles("test") public class Component1TestWithFakeCommunication { @Autowired Component1 component1; @Autowired ServiceClient mockedServiceClient; @Configuration static class ContextConfiguration { @Bean @Primary public ServiceClient mockedServiceClient() { return mock(ServiceClient.class); } } @Before public void setup() { reset(mockedServiceClient); } @Test public void shouldBehaveACertainWay() { // customize mock, call component methods, assert results... } }
java
@RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = MyApplication.class) @WebAppConfiguration @ActiveProfiles("test") public class Component1TestWithRealCommunication { @Autowired Component1 component1; @Autowired ServiceClient mockedServiceClient; @Before public void setup() { reset(mockedServiceClient); } @Test public void shouldBehaveACertainWay() { // call component methods, assert results... } @Configuration static class RealCommunicationContextConfiguration { // Define beans specific to this test } }

الآن، في كل اختبار، يمكننا تعريف تكوينات السياق المحلية التي تحتوي على الحاويات التي نريد استخدامها في كل اختبار. باستخدام @Configuration، يمكننا تحديد الحاويات المراد تجاوزها. على سبيل المثال، يمكن تعريف الحاوية ServiceClient كحاوية رئيسية (@Primary) في الاختبار Component1TestWithFakeCommunication وحذف تعريفها في الاختبار Component1TestWithRealCommunication لاستخدام الحاوية الحقيقية.

باستخدام هذه الإعدادات، يجب أن تعمل الاختبارات كما هو متوقع، حيث ستتم تكوين الحاويات وفقًا لتكوينات السياق المحلية المحددة لكل اختبار بدلاً من استخدام تكوينات MyApplication الرئيسية. هذا يسمح بتحقيق الهدف المطلوب من إعداد بيئة اختبار مختلفة دون التأثير على بيئة الاختبار الأخرى.

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

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

على سبيل المثال، يمكن تعريف تكوينات السياق المحلية باستخدام ملفات الملفات النشطة كالتالي:

java
@Configuration @Profile("fake") public class FakeCommunicationContextConfiguration { @Bean @Primary public ServiceClient mockedServiceClient() { return mock(ServiceClient.class); } }
java
@Configuration @Profile("real") public class RealCommunicationContextConfiguration { // Define beans specific to real communication test }

ثم، يمكن تحديد ملف النشاط المطلوب لكل اختبار باستخدام تعليمة @ActiveProfiles:

java
@ActiveProfiles("fake") public class Component1TestWithFakeCommunication { // Test configuration }
java
@ActiveProfiles("real") public class Component1TestWithRealCommunication { // Test configuration }

هذا النهج يسمح بتحديد تكوينات السياق المحلية بناءً على ملفات النشاط المختلفة، مما يجعل الاختبارات أكثر قابلية للتخصيص والفهم.

في الختام، يجب أن نلاحظ أن استخدام تكوينات السياق المحلية في اختبارات Spring يتيح لنا القدرة على تحقيق بيئات اختبار مخصصة لكل اختبار دون التأثير على الاختبارات الأخرى. هذا يساعد على زيادة دقة اختباراتنا وتقليل الاعتماد على تهيئة الحاويات الرئيسية في التطبيق.

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