سؤال

أنا حاليًا بصدد استخدام Mockito لسخرية كائنات طبقة الخدمة الخاصة بي في تطبيق SPRING MVC الذي أرغب في اختبار أساليب وحدة التحكم الخاصة بي. ومع ذلك ، كما كنت أقرأ عن تفاصيل Mockito ، لقد وجدت أن الأساليب doReturn(...).when(...) يعادل when(...).thenReturn(...). لذا ، سؤالي هو الهدف من وجود طريقتين تفعل نفس الشيء أو ما هو الفرق الدقيق بين doReturn(...).when(...) و when(...).thenReturn(...)?

سيكون موضع تقدير أي مساعدة.

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

المحلول

الجملة اثنين للعبادة تعادل تقريبا. ومع ذلك ، يمكنك دائماً استعمال doReturn/when للعبادة. ولكن هناك حالات حيث أنت لا يمكن استعمال when/thenReturn. أساليب الفراغ القليلة هي واحدة من هذا القبيل. وتشمل البعض الآخر استخدام مع جواسيس mockito ، وذوي نفس الطريقة أكثر من مرة.

شيء واحد when/thenReturn يعطيك ذلك doReturn/when لا ، هو التحقق من القيمة التي تعود إليها ، في وقت الترجمة. ومع ذلك ، أعتقد أن هذا ليس له قيمة تقريبًا - إذا كنت قد أخطأت في النوع ، فستكتشف بمجرد إجراء الاختبار.

أوصي بقوة باستخدام فقط doReturn/when. لا فائدة من تعلم بناء جملة عندما يفعل المرء.

قد ترغب في الرجوع إلى إجابتي في تشكيل mockito "القواعد" - إجابة أكثر تفصيلاً على سؤال وثيق الصلة.

نصائح أخرى

يتصرف كلا النهجين بشكل مختلف إذا كنت تستخدم كائنًا مفيدًا (مشروحًا مع @Spy) بدلا من وهمية (مشروح مع @Mock):

  • when(...) thenReturn(...) يقوم بإجراء مكالمة حقيقية قبل إرجاع القيمة المحددة مباشرة. لذا ، إذا كانت الطريقة المدعوين تطرح استثناءً عليك التعامل معها / السخرية منها وما إلى ذلك. بالطبع لا تزال تحصل على النتيجة (ما تحدده فيه thenReturn(...))

  • doReturn(...) when(...) لا يدعو الطريقة على الإطلاق.

مثال:

public class MyClass {
     protected String methodToBeTested() {
           return anotherMethodInClass();
     }

     protected String anotherMethodInClass() {
          throw new NullPointerException();
     }
}

اختبار:

@Spy
private MyClass myClass;

// ...

// would work fine
doReturn("test").when(myClass).anotherMethodInClass();

// would throw a NullPointerException
when(myClass.anotherMethodInClass()).thenReturn("test");

يبدو أن Mockito Javadoc doReturn() بدلاً من when()استخدم doreturn () في تلك المناسبات النادرة عندما لا يمكنك استخدام mockito. عندما (الكائن).

احذر من أن mockito. عندما ينصح دائمًا (الكائن) بالقلق لأنه آمن من نوع الوسيطة وأكثر قابلية للقراءة (خاصة عند استدعاء المكالمات المتتالية).

فيما يلي تلك المناسبات النادرة عندما يكون Doreturn () مفيدًا:

1. عندما تجسس الأشياء الحقيقية واتصال الأساليب الحقيقية على تجسس يجلب الآثار الجانبية

List list = new LinkedList(); List spy = spy(list);

.

when(spy.get(0)).thenReturn("foo");

// يجب عليك استخدام doreturn () للعبادة: doReturn("foo").when(spy).get(0);

2. تجاوز استثناء سابق:

when(mock.foo()).thenThrow(new RuntimeException());

// مستحيل: تسمى طريقة Foo () الاستثناء حتى يتم طرح RunTimeException. when(mock.foo()).thenReturn("bar");

// يجب عليك استخدام doreturn () للعبادة:

doReturn("bar").when(mock).foo(); تعرض السيناريوهات المذكورة أعلاه مفاضلة بناء جملة Mockito الأنيقة. لاحظ أن السيناريوهات نادرة جدًا. يجب أن يكون التجسس متفرغًا وأن يكون استثناء الاستثناء أمرًا نادرًا جدًا. ناهيك عن أن الإفراط في تجاوز القطع هو رائحة رمز محتملة تشير إلى الكثير من القطع.

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

PowerMockito.doReturn(false, false, true).when(SomeClass.class, "SomeMethod", Matchers.any(SomeClass.class));

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

يتم استخدام البديل الأخير لطرق على السخرية التي تعود void.

يرجى إلقاء نظرة ، على سبيل المثال ، هنا:كيفية جعل الأساليب السخرية مع mockito

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