Mockito.any () জেনারিক্সের সাথে ইন্টারফেস পাস করুন


170

জেনেরিকের সাথে ইন্টারফেসের ধরণটি পাস করা কি সম্ভব?

ইন্টারফেস:

public interface AsyncCallback<T>

আমার পরীক্ষার পদ্ধতিতে:

Mockito.any(AsyncCallback.class)

ফেলে <ResponseX>পিছনে বা .classDidnt হবে।

উত্তর:


306

একটি টাইপ-নিরাপদ উপায় রয়েছে: ArgumentMatchers.any()প্রকারের সাথে এটি ব্যবহার করুন এবং যোগ্য করুন:

ArgumentMatchers.<AsyncCallback<ResponseX>>any()

4
আমি নিশ্চিত করি যে এই উত্তরটি কাজ করে এবং সতর্কতাটি সঠিকভাবে দমন করে।
কেভিনার্পে

1
এটি সত্যই নিরাপদ নয় যেহেতু প্রকৃত পদ্ধতিটি কেবলমাত্র সঠিকভাবে টাইপ করা যুক্তি দিয়েই বলা যেতে পারে। প্রাক জাভা 8 সংকলকটির এই ধরণের অনুক্রমের অভাব পূরণ করার জন্য এটি কেবলমাত্র প্রয়োজনীয় ছিল।
Herman

আমি এই রেসপন্স এন্টিটি <লিস্ট <ম্যাপ <স্ট্রিং, অবজেক্ট >>> রেসপন্সটি = ম্যাচার্স এর মতো কিছু ব্যবহার করেছি <<রেসপন্স এন্টিটি <লিস্ট <ম্যাপ <স্ট্রিং, অবজেক্ট >>>> যে কোনও (); এবং এটি সর্বদা
অরুণ

6
(Matchers.<AsyncCallback<ResponseX>>any()
মকিতোর

15
Matchersআসলে অবচয়, কিন্তু ArgumentMatchersকাজ করেছে।
guijob

67

জাভা 8 ব্যবহার করে, আপনি any()বর্ধিত ধরণের অনুক্রমের কারণে আর্গুমেন্ট বা টাইপ পরামিতি ছাড়াই (স্ট্যাটিক আমদানি ধরে রেখে) ব্যবহার করতে পারেন । সংকলকটি এখন আপনার টার্গেট টাইপ (পদ্ধতি আর্গুমেন্টের ধরণ) থেকে জানে যে আপনি আসলে Matchers.<AsyncCallback<ResponseX>>any()যা জাভা 8 এর পূর্ববর্তী সমাধান।


পাশাপাশি any()মেলে না AsyncCallback<AnyOtherType>?
ম্যাথু

@MatthewRead ব্যবহার AsyncCallback<AnyOtherType>এমনকি কম্পাইল করা উচিত নয় যদি যুক্তি টাইপ 'AsyncCallback <ResponseX>' হয়।
Herman

1
আমি এমন পরিস্থিতি নিয়ে ভাবছি যেখানে আর্গুমেন্টের ধরণটি জেনেরিকও হয় তবে আপনি কেবল একটি কংক্রিট টাইপের জন্য এটি উপহাস করতে চান (বা এটি বিভিন্ন উপায়ে একাধিক প্রকারের জন্য উপহাস করে)। প্রদত্ত when(x.y(any())).thenAnswer(...)উদাহরণস্বরূপ, যেখানে yহয় public <T> T y(AsyncCallback<T> arg)। সম্ভবত উত্তরের প্রকারটি পরীক্ষা করা আরও ভাল হবে, যদি এটির প্রয়োজন হয় তবে?
ম্যাথু

2
@ ম্যাথার রিড ইরেজরের কারণে, আসল প্রকারটি মকিতো দ্বারা রানটাইম এ পরীক্ষা করা যায় না। সুতরাং আপনি এমনকি ব্যবহার করতে পারবেন না isA()। যদি বস্তুটি Classধরণের সাথে সম্পর্কিত কোনও বস্তু ধারণ করে এবং ইন্টারফেসটি এটি প্রকাশ করে তবে আমার ধারণা আপনি এটি একটি কাস্টম ম্যাচারে পরীক্ষা করতে পারেন। বা উদাহরণস্বরূপ কোনও ক্ষেত্রে Collectionআপনি উপাদানগুলির প্রকারটি পরীক্ষা করতে পারেন।
Herman

1
MatchersArgumentMatchers
মকিতো

15

জেনেরিকদের জন্য আমাকে নিম্নলিখিত মেক্যামিজম গ্রহণ করতে হয়েছিল:

import static org.mockito.Matchers.any;
List<String> list = any();
when(callMyMethod.getResult(list)).thenReturn(myResultString);

আশা করি এটি কাউকে সাহায্য করবে।


3
আমার উত্তর দেখুন: জাভা 8 এর সাথে এটি আর দরকার নেই
Herman

5

উত্তর হিসাবে পিয়েরেফেরিয়ার মন্তব্য পোস্ট করা যা মন্তব্যগুলির পরিবর্তে কোনও উত্তরে উপস্থিত থাকলে কার্যকর হতে পারে।

মকিতোর নতুন সংস্করণ সহ: (Matchers.<AsyncCallback<ResponseX>>any()


1
আমি তার উত্তরটি মূল উত্তরে যুক্ত করেছি
জোয়ারগি

2

পদ্ধতিতে যে কোনও () এর কাছে কল কল করার পরে সোসফ্টের উত্তরের অর্থ ফেরত প্রকারের অনুমানের অনুমতি দেওয়ার কারণে আমি যোগ্যতাটি সরিয়ে ফেলতে পারি:

private HashMap<String, String> anyStringStringHashMap() {
    return Matchers.any();
}

0

আপনি যদি এটি চান তবে দমন সতর্কতা যুক্ত করে কেবল এটি নিক্ষেপ করতে পারেন:

@SuppressWarnings("unchecked")    
AsyncCallback<ResponseX> callback = Mockito.any(AsyncCallback.class)

জাভা যদি 'জেনেরিক' জেনেরিকদের অনুমতি দেয় তবে তাদের মতো এই পদ্ধতি থাকতে পারে যা আপনি সন্ধান করছেন

private static <T, E> T<E> mock(Class<T<E>> clazz)

আমি যখন এটি চেষ্টা করেছি, তখন আমার পরীক্ষায় আমি একটি ত্রুটি পেয়েছি:You cannot use argument matchers outside of verification or stubbing.
কেভিনার্পে

ব্যবহার করার জন্য একটি ভাল ধারণা নয় @SuppressWarnings: প্রাক-জাভা 8, আপনি যদি এটি একটি পৃথক ভেরিয়েবলের জন্য বরাদ্দ করতে যাচ্ছিলেন তবে আপনি any()কেবলইআইএনইয়ের উত্তর হিসাবে ব্যবহার করতে পারেন । এখন জাভা 8 এর সাথে any()আলাদা অ্যাসাইনমেন্টের প্রয়োজন ছাড়াই ইনলাইন ব্যবহার করা যেতে পারে।
Herman

@ কেভিনারপে যদি আপনার একাধিক যুক্তি ম্যাচার থাকে তবে তাদের জাভা ভাষা নির্দিষ্ট করে হিসাবে অবশ্যই ডাকা হবে।
TWiStErRob 13

0

স্প্রিং ব্যবহার করে আমারও একই সমস্যা ছিল Example:

Mockito.when(repo.findAll(Mockito.<Example<SrvReqToSupplierComment>>any()))
            .thenReturn(Lists.emptyList());

এখানে, আপনাকে যোগ্যতা ব্যবহার করতে হবে, খ / সি সন্ধানের সমস্ত পদ্ধতি একাধিক ধরণের, পছন্দ মতো Sortএবং নিতে পারে Iterable। আপনি Mockito.any(Example.class)ধরণের সুরক্ষা সতর্কতা সহ অবশ্যই ব্যবহার করতে পারেন ।

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