سؤال

لدي واجهة مع طريقة تتوقع مجموعة من 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.

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