क्या आप AssertJ assertThat में एक कस्टम संदेश जोड़ सकते हैं?


93

हमारे पास एक परीक्षण सूट है जो प्राथमिक रूप से हैमरेस्ट मैचर्स के साथ ज्यूनिट के दावे का उपयोग करता है। हमारी टीम में से एक ने AssertJ के साथ प्रयोग करना शुरू कर दिया और लोगों को इसके वाक्यविन्यास, लचीलेपन और घोषणा-पत्र से प्रभावित किया। वहाँ एक सुविधा है कि JUnit प्रदान करता है कि मैं AssertJ के लिए एक समान नहीं मिल सकता है: एक कस्टम मुखर विफलता संदेश जोड़ रहा है।

हम अक्सर उन वस्तुओं की तुलना कर रहे हैं जो मानव पठनीयता के लिए नहीं बनाई गई हैं और उनमें यादृच्छिक-प्रतीत होने वाले Ids या UUIDs होंगे और यह बताना असंभव है कि वे उस डेटा द्वारा होना चाहिए जो वे शामिल हैं। यह हमारे कोडबेस के लिए एक अपरिहार्य स्थिति है, दुख की बात है कि जिस उद्देश्य की पूर्ति के लिए यह आवश्यक है, उसे समझने के बिना अन्य सेवाओं के बीच डेटा मैप कर रहा है।

JUnit में, assertThatविधि परम के String reasonपहले एक पैरामीटर के साथ एक संस्करण प्रदान करती है Matcher<T>। यह एक छोटी डिबग स्ट्रिंग को जोड़ने के लिए तुच्छ बनाता है समस्या पर कुछ प्रकाश डालना, जैसे कि तुलना का मानव के लिए क्या मतलब होना चाहिए।

दूसरी ओर, AssertJ, एक अलग-अलग जेनरिकstatic assertThat तरीके प्रदान करता है जो इंटरफ़ेस Assert या इसके एक कार्यान्वयन वर्गों में से किसी एक को वापस करते हैं। यह इंटरफ़ेस विफलताओं के साथ शामिल होने के लिए एक कस्टम संदेश सेट करने का एक मानक तरीका प्रदान नहीं करता है।

क्या AssertJ API या इसके एक्सटेंशन में से कोई एक ऐसा तरीका है जिससे हम जो भी संदेश जोड़ना चाहते हैं, उसके लिए प्रत्येक कस्टम प्रकार के लिए एक कस्टम एस्टर क्लास बनाए बिना कोई एक्सटेंशन है?

जवाबों:


139

और क्लासिक फैशन में, मैंने पाया कि प्रश्न पोस्ट करने के बाद मैं क्या देख रहा था। उम्मीद है कि इससे अगले व्यक्ति के लिए यह पता करना आसान हो जाएगा कि उसे क्या कहा जाता है। जादू की विधि भ्रामक रूप से अल्प-नामित है as, जो एक अन्य इंटरफ़ेस का हिस्सा है जो AbstractAssertलागू करता है: वर्णनात्मक , आधार सिद्धांत इंटरफ़ेस नहीं।

public S as(String description, Object... args)

String.format(String, Object...)वाक्यविन्यास का समर्थन करने वाली इस वस्तु का विवरण सेट करता है ।
उदाहरण :

try {
  // set a bad age to Mr Frodo which is really 33 years old.
  frodo.setAge(50);
  // you can specify a test description with as() method or describedAs(), it supports String format args
  assertThat(frodo.getAge()).as("check %s's age", frodo.getName()).isEqualTo(33);
} catch (AssertionError e) {
  assertThat(e).hasMessage("[check Frodo's age] expected:<[33]> but was:<[50]>");
}

जहां पकड़ ब्लॉक में उद्धृत स्ट्रिंग वह hasMessageहै जो आपके इकाई परीक्षण आउटपुट लॉग में प्रकट होती है यदि अभिकथन विफल हो जाता है।


मैंने प्रश्न में जुड़े कस्टम मुख पृष्ठfailWithMessage में सहायक को नोटिस करके यह पाया । JavaDoc कि विधि के लिए बताते हैं कि यह सुरक्षित है, तो यह कॉल करने से नहीं किया जा सकता एक कस्टम संदेश सेट करने के लिए। हालांकि यह सहायक का उल्लेख करता है :as

इसके अलावा, इस विधि के साथ as(String, Object...)उपयोगकर्ता द्वारा परिभाषित या ओवरराइड त्रुटि संदेश के साथ सेट किसी भी विवरण का सम्मान करता है overridingErrorMessage(String, Object...)

... और ओवरराइडिंग ErrorMessage हेल्पर, जो पूरी तरह से expected: ... but was:...प्रदान किए गए नए स्ट्रिंग के साथ मानक AssertJ संदेश को बदल देता है ।

AssertJ होमपेज या तो सहायक का उल्लेख नहीं करता है जब तक कि सुविधाओं पर प्रकाश डाला गया पृष्ठ नहीं होता है, जो शीतल अभिकथन अनुभाग asमें सहायक का उदाहरण दिखाता है , लेकिन यह सीधे वर्णन नहीं करता है कि यह क्या करता है।


25

पैट्रिक एम के जवाब में एक और विकल्प जोड़ने के लिए:

उपयोग करने के बजाय Descriptable.as, आप भी उपयोग कर सकते हैं AbstractAssert.withFailMessage():

try {
  // set a bad age to Mr Frodo which is really 33 years old.
  frodo.setAge(50);
  // you can specify a test description via withFailMessage(), supports String format args
  assertThat(frodo.getAge()).
    withFailMessage("Frodo's age is wrong: %s years, difference %s years",
      frodo.getAge(), frodo.getAge()-33).
    isEqualTo(33);
} catch (AssertionError e) {
  assertThat(e).hasMessage("Frodo's age is wrong: 50 years, difference 17 years");
}

उपयोग करने का अंतर Descriptable.asयह है कि यह आपको कस्टम संदेश पर पूर्ण नियंत्रण देता है - कोई "अपेक्षित" और "लेकिन" नहीं था।

यह उपयोगी है जहां परीक्षण किए जा रहे वास्तविक मूल्य प्रस्तुति के लिए उपयोगी नहीं हैं - यह विधि आपको अन्य, संभवतः गणना किए गए मानों को दिखाने की अनुमति देती है, या बिल्कुल भी नहीं।


ध्यान दें, जैसे Descriptable.as, आपको किसी भी वास्तविक दावे withFailMessage() से पहले कॉल करना होगा - अन्यथा यह काम नहीं करेगा, क्योंकि पहले आग लग जाएगी। यह जवादोक में नोट किया गया है।


4
"आपको किसी भी वास्तविक अभिकथन से पहले फ़ैलमेलेज़ () के साथ कॉल करना होगा" धन्यवाद, इसने मुझे उलझा दिया। कॉलिंग withFailMessageपदार्थ का क्रम ; मुझे AssertJ पसंद है, लेकिन यह बेकार है।
अभिजीत सरकार


0

as()AssertJ में इनबिल्ट विधि का उपयोग करें । उदाहरण के लिए:

 assertThat(myTest).as("The test microservice is not active").isEqualTo("active");
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.