মকিতোর জেনেরিক "যে কোনও ()" পদ্ধতি ব্যবহার করা


194

আমার এমন একটি পদ্ধতির সাথে একটি ইন্টারফেস রয়েছে যা এর অ্যারের প্রত্যাশা করে Foo:

public interface IBar {
  void doStuff(Foo[] arr);
}

আমি মকিতো ব্যবহার করে এই ইন্টারফেসটি উপহাস করছি, এবং আমি যেটি doStuff()বলা হয় তা দৃ to়ভাবে বলতে চাই , তবে কোন যুক্তিটি পাস হয়েছে তা আমি বৈধতা দিতে চাই না - "যত্ন নেই"।

আমি any()পরিবর্তে জেনেরিক পদ্ধতিটি ব্যবহার করে নীচের কোডটি কীভাবে লিখব anyObject()?

IBar bar = mock(IBar.class);
...
verify(bar).doStuff((Foo[]) anyObject());

উত্তর:


111

জাভা 8 যেহেতু আপনি যুক্তি-কম anyপদ্ধতিটি ব্যবহার করতে পারেন এবং টাইপ যুক্তিটি সংকলক দ্বারা অনুমান করা হবে:

verify(bar).doStuff(any());

ব্যাখ্যা

জাভা 8-এ নতুন জিনিসটি হ'ল একটি লক্ষ্যের ধরণের লক্ষ্যটি তার উপ-এক্সপ্রেশনগুলির টাইপ পরামিতিগুলি নির্ধারণ করতে ব্যবহৃত হবে। জাভা 8 এর পূর্বে কেবলমাত্র প্যারামিটার ইনফারেন্স (বেশিরভাগ সময়) টাইপ করার পদ্ধতিগুলিতে তর্ক।

এক্ষেত্রে প্যারামিটার ধরণের জন্য doStuffটার্গেট প্রকার হবে any()এবং প্রত্যাবর্তনের মানের ধরণটি any()সেই যুক্তির ধরণের সাথে মেলে বেছে নেওয়া হবে।

এই প্রক্রিয়াটি জাভা 8 এ যুক্ত করা হয়েছিল মূলত ল্যাম্বডা এক্সপ্রেশনগুলি সংকলন করতে সক্ষম হতে, তবে এটি সাধারণত টাইপ ইনফারেন্সগুলি উন্নত করে।


আদিম ধরণের

দুর্ভাগ্যক্রমে: এটি আদিম ধরণের সাথে কাজ করে না:

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এবং ব্যতিক্রম ছুঁড়ে যাবে।


প্রতিবার এই উত্তরটি উপভোগ করার সাথে সাথে আমি আনন্দিতভাবে অবাক হই! আমি অনুমান করতাম যে জাভা 8-এর পরে প্রশ্নটি খুব বেশি মনোযোগ আকর্ষণ করবে না, যেহেতু anyপদ্ধতিটি কেবল কাজ করা উচিত। যে জিনিসগুলি কেবল কাজ করে আপনি তার উত্তর খুঁজে পান না!
লি

আমি এখানে এসেছি কারণ আমার কোডটি কেন কাজ করে না তা জানতাম না any()তবে ঠিক ছিল anyBoolean(), যা আপনার উত্তরের শেষ অংশটি সুন্দরভাবে আলোকপাত করে।
অ্যাড্রিনডাব্লু

274

এই কাজ করা উচিত

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.verify;

verify(bar).DoStuff(any(Foo[].class));

31
ধরো যদি কেউ Scala এটা প্রয়োজন:verify(bar).DoStuff(any[Array[Foo]])
tolitius

6
আমদানি নিয়ে আমার সমস্যা ছিল, আমি আমার আমদানিতে হ্যামক্রাস্ট থেকে যে কোনও () ব্যবহার করছিলাম এবং এটি মকিতো থেকে একটিটির সাথে সংঘর্ষে।
ডোপেলগ্র্যাঞ্জার

4
দয়া করে এপিআইতে একবার দেখুন, শ্রেণি যুক্তি সবেমাত্র ingালাইয়ের জন্য ব্যবহৃত হয়, পদ্ধতিটি এখনও কোনও ধরণের অবজেক্ট গ্রহণ করে! সাইট.মকিতো.আর । / মকিতো / ডকস / কর্নার / অর্গ / মকিতো / । এই ক্ষেত্রে সাইটটির জন্য আইএসএ () ব্যবহার করুন mmockito.org/mockito/docs/current/org/mockito/…
থিলকো

1
হ্যাকক্রাস্টের সাথে নামের সংঘাত এড়াতে এই শ্রেণিটি এখন অবহেলিত। Org.mockito.ArgumentMatchers
leo9r

12

আপনি এটির 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)


এটা সঠিক উত্তর. যে কোনও (ক্লাজ) ব্যবহার সম্পূর্ণ ভুল।
সুরসিন তানচরওন

3
@ সুরসিনটানচরোয়েন আসলে, যে কোনও (শ্রেণি) isA (ক্লাস) এর একটি মাত্র নাম (ডকস দেখুন)। সুতরাং এটি মোটেও ভুল নয়।
jmiserez

8

আমার সর্বশেষ প্রকল্পের জন্য আমি এই বৈশিষ্ট্যটি ব্যবহার করার প্রয়োজন ছিল (এক পর্যায়ে আমরা 1.10.19 থেকে আপডেট করেছি), কেবলমাত্র ব্যবহারকারীদের (যা ইতিমধ্যে মকিতো-কোর সংস্করণ ২.১.০ বা তার বেশি ) ব্যবহার করে রাখা হয়েছে, স্থির উপরের উত্তরগুলি থেকে পদ্ধতিগুলি ArgumentMatchersক্লাস থেকে নেওয়া উচিত :

import static org.mockito.ArgumentMatchers.isA;
import static org.mockito.ArgumentMatchers.any;

আপনি যদি নিজের মকিতো প্রত্নতাত্ত্বিক সংস্করণ 3 থেকে শুরু করে আপ টু ডেট রাখার পরিকল্পনা করছেন তবে দয়া করে এটি মনে রাখবেন: এই শ্রেণিটি আর থাকতে পারে না:

২.১.০ এবং তার উপরে হিসাবে, org.mockito.Matchers এর জাভাদোক বলেছেন:

ব্যবহার org.mockito.ArgumentMatchers। হামক্রেস্ট * org.hamcrest.Matchers শ্রেণীর সাথে নামের সংঘর্ষ এড়াতে এই ক্লাসটি এখন অবহেলিত । এই শ্রেণিটি সম্ভবত 3.0 সংস্করণে সরানো হবে।

আপনি আরও পড়ার জন্য প্রস্তুত থাকলে আমি মকিটো ওয়াইল্ডকার্ডগুলিতে একটি ছোট্ট নিবন্ধ লিখেছি ।


স্ক্যালায় আমি কীভাবে org.mockito.আরগমেন্ট ম্যাচার আমদানি করতে পারি? আমি org.mockito.আরগুমেন্টম্যাচার আমদানি করার চেষ্টা করেছি any আমি ত্রুটি পেয়েছি `মূল্য যে কোনওটি org.mockito এর সদস্য নয় rআরগমেন্ট ম্যাথার
মনু

আপনি দয়া করে আমাকে বলতে পারেন সংস্করণ 3.0 এর সমতুল্য কি?
মানু চদা

এটি প্রকাশিত হওয়ার পরে আমরা জানতে পারি;)
ম্যাকিয়েজ কোওলস্কি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.