আপনি কি AssertJ assertThat এ একটি কাস্টম বার্তা যুক্ত করতে পারেন?


90

আমাদের কাছে একটি টেস্ট স্যুট রয়েছে যা প্রাথমিকভাবে হ্যামরেস্ট ম্যাথারদের সাথে ইউএনইট এ্যাসেরেন্স ব্যবহার করে। আমাদের টিমের একজন এসেটজেজে পরীক্ষা করা শুরু করে এবং এর সিনট্যাক্স, নমনীয়তা এবং ঘোষণামূলক- নেসে লোককে মুগ্ধ করে। JUnit সরবরাহ করে যে একটি বৈশিষ্ট্য রয়েছে যে আমি AssertJ- তে কোনও সমতুল্য খুঁজে পাচ্ছি না: একটি কাস্টম প্রতিস্থাপন ব্যর্থতা বার্তা যুক্ত করে।

আমরা প্রায়শই এমন জিনিসগুলির সাথে তুলনা করছি যা মানব পাঠযোগ্যতার জন্য তৈরি করা হয়নি এবং এলোমেলোভাবে দেখতে পাওয়া আইডি বা ইউআইডি রয়েছে এবং তাদের যে ডেটা রয়েছে সেগুলি দ্বারা তাদের কী হবে বলে ধারণা করা অসম্ভব। এটি আমাদের কোডবেসের জন্য একটি অপরিবর্তনীয় পরিস্থিতি, দুঃখের বিষয়, এটি যে উদ্দেশ্যটি পূরণ করে তার অংশ হিসাবে এটি অগত্যা তা কী তা না বুঝে অন্যান্য পরিষেবার মধ্যে ডেটা ম্যাপ করা।

JUnit এ, assertThatপদ্ধতিটি String reasonপ্যারামের আগে একটি প্যারামিটার সহ একটি সংস্করণ সরবরাহ করে Matcher<T>। এটি তুলনাকে কীভাবে বোঝাতে হবে তার মতো সমস্যার বিষয়ে কিছুটা আলোকপাত করে একটি সংক্ষিপ্ত ডিবাগ স্ট্রিং যুক্ত করা তুচ্ছ করে তোলে।

অন্যদিকে, AssertJ একটি মিলিয়ন বিভিন্ন জেনেরিকাইজডstatic assertThat পদ্ধতি সরবরাহ করে যা ইন্টারফেসের কিছু রূপের আসর্ট বা তার অনেকগুলি বাস্তবায়নকারী ক্লাসগুলির মধ্যে একটি ফেরত দেয় । এই ইন্টারফেসটি ব্যর্থতার সাথে অন্তর্ভুক্ত করার জন্য কাস্টম বার্তা সেট করার মানক উপায় সরবরাহ করে না।

আমরা যে বার্তাগুলিতে বার্তা যুক্ত করতে চাই তার প্রতিস্থাপন টাইপের জন্য কাস্টম অ্যাসেট ক্লাস তৈরি না করেই এ্যাসেটজে এপিআই বা এর কোনও এক্সটেনশান থেকে এই কার্যকারিতাটি পাওয়ার কোনও উপায় আছে কি ?

উত্তর:


137

এবং ক্লাসিক ফ্যাশনে, আমি প্রশ্নটি পোস্ট করার পরে মুহুর্তের জন্য আমি যা খুঁজছিলাম তা পেয়েছি। আশা করি এর দ্বারা পরবর্তী ব্যক্তির পক্ষে এটি কী বলা হয় তা না জেনে আগে এটি সন্ধান করা আরও সহজ করে দেবে Hope ম্যাজিক পদ্ধতি হ'ল প্রতারণামূলকভাবে সংক্ষিপ্ত-নাম 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]>");
}

যদি দৃ block hasMessage় ব্যর্থতা থাকে তবে ক্যাচ ব্লকে সেই উদ্ধৃত স্ট্রিংটিই আপনার ইউনিট পরীক্ষার আউটপুট লগে প্রদর্শিত হয়।


প্রশ্নের মধ্যে লিঙ্কযুক্ত কাস্টম যোগ পৃষ্ঠাটিতেfailWithMessage সহায়তাকারীকে লক্ষ্য করে আমি এটি পেয়েছি । এই পদ্ধতির জাভাডোকটি এটি সুরক্ষিত বলে উল্লেখ করেছে, তাই এটি কাস্টম বার্তা সেট করতে কলকারীরা ব্যবহার করতে পারবেন না। এটি অবশ্য সহায়কটির কথা উল্লেখ করে :as

তদুপরি, এই পদ্ধতিটি as(String, Object...)ব্যবহারকারীর দ্বারা সংজ্ঞায়িত ত্রুটি বার্তার সাথে সেট করা বা ওভাররাইড হওয়া কোনও বিবরণকে সম্মান করে overridingErrorMessage(String, Object...)

... এবং ওভাররাইডিংয়েররমেসেজ সহায়তাকারী, যা expected: ... but was:...সরবরাহিত স্ট্রিংয়ের সাথে স্ট্যান্ডার্ড অ্যাসেটজে ম্যাসেজকে পুরোপুরি প্রতিস্থাপন করে ।

যতক্ষণ না হাইলাইট পৃষ্ঠা, যা শো উদাহরণ অতিরিক্ত বৈশিষ্ট্যগুলিও উপস্থিত রয়েছে AssertJ হোমপেজে পারেন সাহায্যকারী উল্লেখ না asমধ্যে সাহায্যকারী নরম গবেষকেরা অধ্যায়, কিন্তু সরাসরি বর্ণনা না এটা কি করে।


22

প্যাট্রিক এম এর উত্তরে আর একটি বিকল্প যুক্ত করতে:

ব্যবহারের পরিবর্তে 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হ'ল এটি আপনাকে কাস্টম বার্তায় সম্পূর্ণ নিয়ন্ত্রণ দেয় - কোনও "প্রত্যাশিত" এবং "তবে" ছিল না।

এটি কার্যকর যেখানে পরীক্ষিত প্রকৃত মান উপস্থাপনের জন্য কার্যকর নয় - এই পদ্ধতিটি আপনাকে পরিবর্তে অন্যান্য, সম্ভবত গণনা করা মানগুলি বা কোনও কিছুই দেখানোর অনুমতি দেয়।


মনে রাখবেন যে ঠিক ঠিক যেমন কোনও সত্যিকারের দৃ before ়তার আগেDescriptable.as আপনাকে অবশ্যই কল করতে হবে - অন্যথায় এটি কার্যকর হবে না, কারণ দৃ first়তার সাথে দৃ fire়তাটি প্রথম প্রকাশিত হবে। জাভাডোকে এটি উল্লেখ করা হয়েছে।withFailMessage()


4
"সত্যিকারের উত্সাহ দেওয়ার আগে আপনাকে অবশ্যই ফেইলমেসেজ () দিয়ে কল করতে হবে" ধন্যবাদ, এটি আমাকে ট্রিপ করেছে। withFailMessageপদার্থ কল করার ক্রম ; আমি AssertJ পছন্দ করি, কিন্তু এই স্তন্যপান।
অভিজিৎ সরকার


0

as()AssertJ এ ইনবিল্ট পদ্ধতিটি ব্যবহার করুন । উদাহরণ স্বরূপ:

 assertThat(myTest).as("The test microservice is not active").isEqualTo("active");
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.