2009-11-30 7 views
6

इस कोडHamcrest के lessthan संकलन नहीं है

import static org.hamcrest.Matchers.is; 
import static org.hamcrest.number.OrderingComparison.lessThan; 

... 

Assert.assertThat(0, is(lessThan(1))); 

मुद्दों इस संकलन त्रुटि संकलित करने के लिए कोशिश कर रहा है:

assertThat(Object, org.hamcrest.Matcher<java.lang.Object>) cannot be applied to (int, org.hamcrest.Matcher<capture<? super java.lang.Integer>>)

अलग hamcrest संस्करणों के बीच इस टकराव हो सकता है? मैं जुनीट 4.6 और हैमक्रिस्ट 1.3

+0

यदि आपके पास केवल हैमक्रिस्ट की एक प्रति है तो यह कोई संघर्ष नहीं होगा। आपके पास जुनीट और हैमक्रिस्ट के कौन से संस्करण हैं? याद रखें, जुनीट के बाद के संस्करणों में हैमक्रिस्ट की बिट्स की अपनी प्रति शामिल है। – skaffman

+0

मैंने हाल ही में केवल जुनीट का उपयोग करने के बाद, हैमक्रिस्ट जोड़ा। यह संभव है कि जुनीट के साथ बंडल किया गया हैमस्ट्रस्ट पुराना है, और इसे अपडेट किया जाना चाहिए। – ripper234

उत्तर

1

का उपयोग नहीं कर रहा हूं, मैं हैमक्रिस्ट का उपयोग नहीं करता, लेकिन स्पष्ट रूप से int कोई ऑब्जेक्ट नहीं है। इसके बजाय Integer का उपयोग करें, उदा।

Assert.assertThat(Integer.valueOf(0), is(lessThan(1))); 

मैं तुम्हें जावा संस्करण < = 1.4 का उपयोग कर रहे हैं, जहां ऑटो मुक्केबाजी काम नहीं करता है लगता है। इसलिए आपको पहले Integer पर एक स्पष्ट रूपांतरण की आवश्यकता है।

+0

जावा 1.6, और इंटीजर को जोड़ना कुछ भी हल नहीं करता है। ओह, और एक वैध प्रश्न के लिए डाउनवोट के लिए धन्यवाद (मान लीजिए कि यह आप थे, अगर मैं इसे वापस नहीं लेता)। – ripper234

+0

मुझे नहीं लगता कि कोई व्यक्ति उत्तर देता है और प्रश्न को कम करता है। मान लीजिए कि यह कोई और था। मेरे द्वारा +1, सिर्फ इसलिए कि मैं असम्बद्ध डाउनवोट को भी समझ नहीं पा रहा हूं। –

+0

मैंने अभी जेडीके 6, हैमक्रिस्ट-ऑल-1.2.जर और जूनिट -4.7.जर के साथ कोशिश की है और यह ठीक है। Org.junit.Assert का उपयोग करने के लिए ध्यान दें, junit.framework.Assert नहीं। और उन लोगों का अपमान करने से सावधान रहें जो आपकी मदद करने की कोशिश कर रहे हैं, भले ही वे कम हो जाएं (जो मैंने नहीं किया)। – sfussenegger

0

यह एक बहुत ही अजीब समस्या है। मुझे लगता है कि हमें कुछ और जानकारी चाहिए, क्योंकि इसे सही तरीके से काम करना चाहिए। मैंने जुनीट 4.4 और हैमक्रिस्ट 1.1 (थोड़ा सा पुराना, लेकिन यही वह है जो मैं अपने वर्तमान प्रोजेक्ट में उपयोग कर रहा हूं, इसका उपयोग करके इसे पुन: उत्पन्न करने की कोशिश की, इसलिए परीक्षण करना आसान था) और यह पूरी तरह से काम करता था।

फर्क सिर्फ इतना मैंने देखा कि मेरी ग्रहण के बजाय आयातित org.hamcrest.Matchers.lessThanorg.hamcrest.number.OrderingComparisons.lessThan का, लेकिन जब मैं उनसे यह अच्छी तरह से काम दोषरहित है के रूप में।

यह इस तथ्य के कारण हो सकता है कि आप हैमक्रिस्ट या जुनीट के पुराने संस्करण का उपयोग कर रहे हैं (आप वास्तव में किस संस्करण का उपयोग कर रहे हैं? आपने अभी तक इसका उल्लेख नहीं किया है)। अजीब बात यह है कि जब आपने Integer पर एक स्पष्ट कलाकार जोड़ा है तो भी आपको एक त्रुटि मिली है। यह दिलचस्प है, और जब आप इस त्रुटि को पोस्ट करते हैं तो यह सहायक हो सकता है ...

वैसे भी, यह पूरी तरह से काम करना चाहिए क्योंकि कोई वाक्यविन्यास त्रुटियां या कुछ नहीं है, इसलिए आपका सेटअप समस्या का कारण होना चाहिए।

+0

मेरे पास जूनिट 4.6 और हैमक्रिस्ट 1.3 है – ripper234

1

मुझे लगता है कि शायद समस्या यह है कि आपका दावा यह तरीका है। यदि यह कहते हैं,

void assertThat(Object item, Matcher<Object> matcher) { ... } 

तो आप करने के लिए इसे बदलने की जरूरत है:

void <T> assertThat(T item, Matcher<? super T> matcher) { ... } 

हो सकता है कि आपके JUnit पुस्तकालय पुराने हो चुके अपने Hamcrest पुस्तकालय की तुलना में है? क्या आपने उन्हें दोनों ही बनाया? क्या आपके पास संभवतः आपके क्लासपाथ में जुनीट या हैमक्रिस्ट की कई प्रतियां हैं?

5

मेरा मानना ​​है कि समस्या यह है कि जुनीट हैमक्रिस्ट (1.1) की पुरानी प्रतिलिपि के साथ आता है क्योंकि हैमक्रिस्ट के बाद के संस्करण में हस्ताक्षर जुनीट के साथ असंगत हैं। दो संभावित समाधान हैं:

  1. क्लासपाथ से हैमक्रिस्ट (1.3) के अपने संस्करण को छोड़ दें, और जुनीट के साथ बंडल की गई प्रतिलिपि का उपयोग करें।
  2. एक अलग रिहाई JUnit के संस्करण (मेरा मानना ​​है कि जार 'की तरह JUnit-डीईपी-xxx.jar नाम हैं) जो org.hamcrest.MatcherAssert.assertThat को Hamcrest
  3. org.junit.Assert.assertThat() की कॉल बदलें शामिल नहीं है का उपयोग करें() ` ।

बाद शायद मेरी अनुशंसित विकल्प है, क्योंकि assertThat() की Hamcrest संस्करण अच्छे विफलता संदेश, और संस्करणों बाद में पैदा करता है की तुलना में 1.1 कुछ अच्छा सुविधाओं (जैसे किTypeSafeDiagnosingMatcher)।

संबंधित मुद्दे