নিম্নলিখিত উদাহরণ দেওয়া হয়েছে (হামক্রাস্ট ম্যাচারদের সাথে ইউএনইট ব্যবহার করে):
Map<String, Class<? extends Serializable>> expected = null;
Map<String, Class<java.util.Date>> result = null;
assertThat(result, is(expected));
এটি JUnit assertThatপদ্ধতি স্বাক্ষরের সাথে সংকলন করে না :
public static <T> void assertThat(T actual, Matcher<T> matcher)
সংকলক ত্রুটি বার্তাটি হ'ল:
Error:Error:line (102)cannot find symbol method
assertThat(java.util.Map<java.lang.String,java.lang.Class<java.util.Date>>,
org.hamcrest.Matcher<java.util.Map<java.lang.String,java.lang.Class
<? extends java.io.Serializable>>>)
তবে, যদি আমি assertThatপদ্ধতিটির স্বাক্ষরটি এতে পরিবর্তন করি :
public static <T> void assertThat(T result, Matcher<? extends T> matcher)
তারপরে সংকলনটি কাজ করে।
সুতরাং তিনটি প্রশ্ন:
- কেন বর্তমান সংস্করণটি সংকলন করে না? যদিও আমি অস্পষ্টভাবে এখানে covariance বিষয়গুলি বুঝতে পারি, আমি যদি তা করতে পারি তবে অবশ্যই এটি ব্যাখ্যা করতে পারি না।
assertThatপদ্ধতিতে পরিবর্তন করার কোনও খারাপ দিক রয়েছে কিMatcher<? extends T>? আপনি যদি এটি করেন তবে তা ভেঙে যাওয়ার মতো আরও কিছু মামলা রয়েছে?assertThatJUnit- এ পদ্ধতির জেনারাইজেশনের কোনও বক্তব্য আছে কি ?Matcherশ্রেণী হিসেবে, এটি প্রয়োজন বলে মনে হচ্ছে না যেহেতু JUnit ম্যাচ পদ্ধতি, যা একটি টাইপ নিরাপত্তা যা কিছু না বলপূর্বক একটি প্রয়াস মত কোন জেনেরিক, এবং শুধুমাত্র সৌন্দর্য সঙ্গে টাইপ করা হয় না কলMatcherআসলে শুধু না করবে না ম্যাচ, এবং পরীক্ষা নির্বিশেষে ব্যর্থ হবে। কোনও অনিরাপদ অপারেশন জড়িত নেই (বা তাই এটি মনে হয়)।
রেফারেন্সের জন্য, এখানে JUnit বাস্তবায়ন assertThat:
public static <T> void assertThat(T actual, Matcher<T> matcher) {
assertThat("", actual, matcher);
}
public static <T> void assertThat(String reason, T actual, Matcher<T> matcher) {
if (!matcher.matches(actual)) {
Description description = new StringDescription();
description.appendText(reason);
description.appendText("\nExpected: ");
matcher.describeTo(description);
description
.appendText("\n got: ")
.appendValue(actual)
.appendText("\n");
throw new java.lang.AssertionError(description.toString());
}
}