निम्नलिखित उदाहरण को देखते हुए (Hamcrest मैचर्स के साथ JUnit का उपयोग करके):
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)
फिर संकलन काम करता है।
तो तीन प्रश्न:
- वर्तमान संस्करण संकलित क्यों नहीं करता है? हालाँकि, मैं यहाँ के सहसंयोजक मुद्दों को पूरी तरह से समझता हूँ, अगर मैं था तो मैं निश्चित रूप से इसे समझा नहीं सकता था।
- क्या
assertThat
विधि को बदलने में कोई नकारात्मक पहलू हैMatcher<? extends T>
? क्या अन्य मामले हैं जो अगर आपने किए तो वे टूट जाएंगे? - क्या
assertThat
JUnit में विधि के सामान्यीकरण का कोई मतलब है ?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());
}
}