এটি করার আরও দুটি উপায় (@ টমাসজ নুরকিউইকসের পূর্ববর্তী উত্তরের বিষয়ে আমার মন্তব্য দেখুন):
প্রথমটি নির্ভর করে যে সংকলকটি কেবল আপনাকে ভুল ধরণের কিছুতে পাস করতে দেয় না:
when(a.method(any(Class.class))).thenReturn(b);
আপনি হুবহু টাইপিং (টি Class<? extends A>
) হারাতে পারেন তবে এটি আপনার প্রয়োজন অনুসারে সম্ভবত কাজ করে।
দ্বিতীয় আরো অনেক জড়িত কিন্তু তর্কসাপেক্ষে ভাল সমাধান পাওয়া যাবে যদি আপনি সত্যিই নিশ্চিত করুন যে যুক্তি হতে চান method()
একটি হল A
বা একটি উপশ্রেণী A
:
when(a.method(Matchers.argThat(new ClassOrSubclassMatcher<A>(A.class)))).thenReturn(b);
কোথায় ClassOrSubclassMatcher
একটি হয় org.hamcrest.BaseMatcher
হিসাবে সংজ্ঞায়িত:
public class ClassOrSubclassMatcher<T> extends BaseMatcher<Class<T>> {
private final Class<T> targetClass;
public ClassOrSubclassMatcher(Class<T> targetClass) {
this.targetClass = targetClass;
}
@SuppressWarnings("unchecked")
public boolean matches(Object obj) {
if (obj != null) {
if (obj instanceof Class) {
return targetClass.isAssignableFrom((Class<T>) obj);
}
}
return false;
}
public void describeTo(Description desc) {
desc.appendText("Matches a class or subclass");
}
}
রাম রাম! আপনি আসলে যা method()
ফিরে আসে তার উপর আপনাকে আরও ভাল নিয়ন্ত্রণের দরকার না হওয়া পর্যন্ত আমি প্রথম বিকল্পটি নিয়ে যাব :-)
Class<?>
আশ্চর্যজনক!