باستخدام طريقة Mockito العامة "أي ()"
-
21-09-2019 - |
سؤال
لدي واجهة مع طريقة تتوقع مجموعة من Foo
:
public interface IBar {
void doStuff(Foo[] arr);
}
أنا أسخر من هذه الواجهة باستخدام Mockito ، وأود أن أؤكد ذلك doStuff()
يُطلق عليه ، لكنني لا أريد التحقق من صحة الحجة التي يتم تمريرها - "لا تهتم".
كيف أكتب الكود التالي باستخدام any()
, الطريقة العامة ، بدلا من anyObject()
?
IBar bar = mock(IBar.class);
...
verify(bar).doStuff((Foo[]) anyObject());
المحلول
منذ Java 8 يمكنك استخدام الوسيطة أقل any
الطريقة والوسيطة النوع سوف يتم استنتاجها بواسطة المترجم:
verify(bar).doStuff(any());
تفسير
الشيء الجديد في Java 8 هو أن نوع الهدف سيتم استخدام التعبير لاستنتاج معلمات الكتابة من التعبير الفرعي. قبل Java 8 فقط الوسائط إلى الأساليب التي تستخدم لاستدلال المعلمة النوع (معظم الوقت).
في هذه الحالة نوع المعلمة من doStuff
سيكون النوع المستهدف ل any()
, ، ونوع قيمة الإرجاع من any()
سيتم اختيارها لمطابقة نوع الوسيطة.
الأنواع البدائية
هذا لا يعمل مع الأنواع البدائية ، للأسف:
public interface IBar {
void doPrimitiveStuff(int i);
}
verify(bar).doPrimitiveStuff(any()); // Compiles but throws NullPointerException
verify(bar).doPrimitiveStuff(anyInt()); // This is what you have to do instead
المشكلة هي أن المترجم سوف يستنتج Integer
كقيمة الإرجاع any()
. لن يكون Mockito على دراية بهذا (بسبب محو النوع) وإرجاع القيمة الافتراضية لأنواع المراجع ، وهي null
. سيحاول وقت التشغيل إلغاء صناديق قيمة الإرجاع عن طريق الاتصال intValue
طريقة عليها قبل نقلها إلى doStuff
, ، ويتم إلقاء الاستثناء.
نصائح أخرى
هذا يجب أن يعمل
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.verify;
verify(bar).DoStuff(any(Foo[].class));
يمكنك استخدام Mockito.isA()
من أجل هذا:
import static org.mockito.Matchers.isA;
import static org.mockito.Mockito.verify;
verify(bar).doStuff(isA(Foo[].class));
http://site.mockito.org/mockito/docs/current/org/mockito/matchers.html#isa(java.lang.class)
نظرًا لأنني كنت بحاجة إلى استخدام هذه الميزة لأحدث مشروعي (عند نقطة واحدة قمنا بتحديثها من 1.10.19) ، فقط للحفاظ على المستخدمين (الذين يستخدمون بالفعل إصدار Mockito-Core 2.1.0 أو أكثر) حتى الآن ، يجب أخذ الأساليب الثابتة من الإجابات أعلاه ArgumentMatchers
صف دراسي:
import static org.mockito.ArgumentMatchers.isA;
import static org.mockito.ArgumentMatchers.any;
يرجى وضع ذلك في الاعتبار إذا كنت تخطط للحفاظ على القطع الأثرية mockito الخاصة بك حتى الآن قد تبدأ من الإصدار 3 ، قد لم يعد هذا الفصل موجودًا:
حسب 2.1.0 وما فوق ، ينص Javadoc of org.mockito.matchers على:
يستخدم
org.mockito.ArgumentMatchers
. تم الآن إهمال هذا الفصل من أجل تجنب صدام الاسم مع Hamcrest *org.hamcrest.Matchers
صف دراسي. من المحتمل أن تتم إزالة هذه الفئة في الإصدار 3.0.