سؤال

هل من الممكن في Mockito التحقق من الطريقة التي تم استدعاؤها على وهمية بناءً على ما إذا كان النفخة قد تم استخدامه بالفعل في اختبار الوحدة؟

للحصول على مثال بسيط ، أقوم بتزويد مصنع وهمية (FoofActory) لاختبار الوحدة تحت ، وعندما يتم استدعاء foo.create () ، فإنه يعيد وهمية (FOO) لاستخدامها بطرق معينة في الوحدة-تحت- اختبار. كيف يمكنني التحقق من أن foo.method () لا يسمى إلا إذا تم استدعاء Foo.Create () من قبل اختبار الوحدة؟

أتصور أن الرمز سيبدو مثل هذا:

@Before
public void init() {
  Foo mockFoo = mock(Foo.class);
  when(fooFactory.create()).thenReturn(mockFoo);
  test = new UnitUnderTest(fooFactory);
}

@Test
... may or may not create a foo ...

@After
public void cleanup() {
  if (verify(fooFactory).create()) {  // Here's the 'conditional verification'
    Foo mockFoo = fooFactory.create();
    verify(mockFoo).close();
  }
}

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

هل كانت مفيدة؟

المحلول

هل أنت متأكد من أنك تريد كتابة هذا الاختبار؟

أستطيع أن أرى حلين:

1) تريد حقًا التأكد من إنشاء المورد وإغلاقه ، لذا حاول كتابة اختبار ، حيث يمكنك التحقق من كلا مكالمات الطريقة.

2) تريد التأكد من أنه كلما تم فتح المورد ، يتم إغلاقه أيضًا. يمكن تنفيذ ذلك كتأكيد في رمز الإنتاج ...

إذا كنت ترغب حقًا في المضي قدمًا في نهجك ، فيمكنك استثناء أن أول رميات التحقق إذا لم يتم استدعاء طريقة Create (). في الصيد فقط تعود.

كما يجب ألا تقوم بالتحقق في التنظيف ، ولكن في طريقة الاختبار الفعلية.

نصائح أخرى

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

لذلك أقترح تقسيم الاختبار إلى اختبارات متعددة وواحد لكل سيناريو ثم معرفة ما إذا كنت لا تزال بحاجة إلى ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top