আমি কীভাবে একটি আইটেমের মধ্যে একটি নির্দিষ্ট সম্পত্তি সহ উপাদান থাকতে পারি?


103

ধরুন আমি এই স্বাক্ষর সহ একটি পদ্ধতি পরীক্ষা করতে চাই:

List<MyItem> getMyItems();

ধরে নিন MyItemএমন একটি পজো যা এর অনেকগুলি বৈশিষ্ট্য রয়েছে যার মধ্যে একটি হল এর "name"মাধ্যমে অ্যাক্সেস করা getName()

যাচাই সম্পর্কে সবকিছু আমি যত্ন করে List<MyItem>, অথবা কোন Iterableদুটি রয়েছে MyItemদৃষ্টান্ত, যার "name"বৈশিষ্ট্য মান "foo"এবং "bar"। যদি অন্য কোনও বৈশিষ্ট্য মেলে না, আমি সত্যিই এই পরীক্ষার উদ্দেশ্যগুলির জন্য যত্ন নিই না। যদি নামগুলি মিলে যায় তবে এটি একটি সফল পরীক্ষা।

আমি যদি সম্ভব হয় তবে এটি ওয়ান লাইনার হতে চাই। আমি যে ধরণের কাজটি করতে চাই তার কিছু "সিউডো-সিনট্যাক্স" এখানে রয়েছে।

assert(listEntriesMatchInAnyOrder(myClass.getMyItems(), property("name"), new String[]{"foo", "bar"});

হামক্রস্ট কি এই ধরণের জিনিসটির জন্য ভাল হবে? যদি তা হয় তবে আমার সিউডো-সিনট্যাক্সের উপরের হ্যামক্রাস্ট সংস্করণটি ঠিক কী হবে?

উত্তর:


125

আপনাকে ধন্যবাদ @ রাজাওয়ান যিনি আমাকে সঠিক দিকে নির্দেশ করেছেন। আমি এটি এক লাইনে পেতে সক্ষম হয়েছি এবং আমি হ্যামক্রেষ্ট ১.৩ এর জন্য আমদানিগুলি সফলভাবে শিকার করেছি।

আমদানি:

import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.Matchers.contains;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.beans.HasPropertyWithValue.hasProperty;

কোড:

assertThat( myClass.getMyItems(), contains(
    hasProperty("name", is("foo")), 
    hasProperty("name", is("bar"))
));

49

চেষ্টা করুন:

assertThat(myClass.getMyItems(),
                          hasItem(hasProperty("YourProperty", is("YourValue"))));

2
পার্শ্ব নোড হিসাবে - এটি হ্যামক্রিস্ট সমাধান (assertj নয়)
হার্টমুট পি

46

এটি বিশেষত হামক্রস্ট নয়, তবে আমি এখানে উল্লেখ করা ভাল বলে মনে করি। জাভা 8-এ আমি প্রায়শই যা ব্যবহার করি তা হ'ল:

assertTrue(myClass.getMyItems().stream().anyMatch(item -> "foo".equals(item.getName())));

(রডরিগো মানায়ারির সামান্য উন্নতিতে সম্পাদিত It's এটি কিছুটা কম ভারবস। মন্তব্য দেখুন))

এটি পড়া একটু কঠিন হতে পারে তবে আমি টাইপ এবং রিফ্যাক্টরিং সুরক্ষা পছন্দ করি। এটি একত্রে একাধিক শিমের বৈশিষ্ট্য পরীক্ষার জন্যও দুর্দান্ত। যেমন একটি জাভা-এর মতো && ফিল্টার ল্যাম্বডায় অভিব্যক্তি সহ।


2
সামান্য উন্নতি: assertTrue (myClass.getMyItems ()। স্ট্রিম ()। যে কোনও ম্যাচ (আইটেম -> "foo" .সম্পাদনা (আইটেম.জেটনেম ()));
রডরিগো মানারী

@RodrigoManyari, ক্লোজিং প্রথম বন্ধনী অনুপস্থিত
Abdull

1
এই সমাধানটি একটি যথাযথ ত্রুটি বার্তা প্রদর্শন সম্ভাবনা নষ্ট করে।
জিউলিও ক্যাকসিন

@ জিউলিওক্যাসিন আমার মনে হয় না এটি হয়। যদি আপনি JUnit ব্যবহার করেন, আপনি ওভারলোড হওয়া দৃ as়বিজ্ঞানের পদ্ধতিগুলি ব্যবহার করতে এবং assertTrue লিখতে পারেন (..., "আমার নিজের পরীক্ষা ব্যর্থতার বার্তা"); জুনিট.আর.জেউন.িট
মারিও আইস

আমি বলতে চাইছি, আপনি যদি বুলিয়ানের বিরুদ্ধে জোর দিয়ে থাকেন তবে আপনি আসল / প্রত্যাশিত পার্থক্যটি স্বয়ংক্রিয়ভাবে মুদ্রণের ক্ষমতা হারাবেন। ম্যাচার ব্যবহার করে জোর দেওয়া সম্ভব, তবে এটি করার জন্য আপনাকে এই প্রতিক্রিয়াটি অন্য পৃষ্ঠার অনুরূপ হতে সংশোধন করতে হবে।
জিউলিও ক্যাকসিন

20

Assertj এ ভাল।

import static org.assertj.core.api.Assertions.assertThat;

    assertThat(myClass.getMyItems()).extracting("name").contains("foo", "bar");

হ্যামক্রাস্টের তুলনায় অ্যাসেটেরজের জন্য বড় প্লাস কোড সমাপ্তির সহজ ব্যবহার।


16

AssertJ এতে একটি দুর্দান্ত বৈশিষ্ট্য সরবরাহ করে extracting(): আপনি Functionক্ষেত্রগুলি নিষ্কাশন করতে পাস করতে পারেন । এটি সংকলনের সময় একটি চেক সরবরাহ করে।
আপনি সহজেই আকারটি প্রথম দৃsert় করতে পারেন।

এটি দিতে হবে:

import static org.assertj.core.api.Assertions;

Assertions.assertThat(myClass.getMyItems())
          .hasSize(2)
          .extracting(MyItem::getName)
          .containsExactlyInAnyOrder("foo", "bar"); 

containsExactlyInAnyOrder() জোর করে যে তালিকার মধ্যে এই আদেশগুলি কেবল যেই আদেশ হোক না কেন।

তালিকায় এই মানগুলি অন্তর্ভুক্ত রয়েছে তা নিশ্চিত করার জন্য তবে এতে অন্যান্য মানগুলিও থাকতে পারে contains():

.contains("foo", "bar"); 

পার্শ্ব নোট হিসাবে: একটি এর উপাদান থেকে একাধিক ক্ষেত্র যুক্ত করা List, AssertJ এর সাহায্যে আমরা প্রতিটি ফাংশনটিতে প্রত্যাশিত মানগুলিকে মোড়ক দিয়ে এটি করি tuple():

import static org.assertj.core.api.Assertions;
import static org.assertj.core.groups.Tuple;

Assertions.assertThat(myClass.getMyItems())
          .hasSize(2)
          .extracting(MyItem::getName, MyItem::getOtherValue)
          .containsExactlyInAnyOrder(
               tuple("foo", "OtherValueFoo"),
               tuple("bar", "OtherValueBar")
           ); 

4
কেন এটির কোনও অগ্রগতি নেই তা পাবেন না। আমি মনে করি, এটি এখন পর্যন্ত সেরা উত্তর।
পেমা 13

1
AssertJ গ্রন্থাগারটি অনেক বেশি পঠনযোগ্য তখন JUnit assertion API।
সংগৃহীত

@ সঙ্গীত সম্মত এবং এছাড়াও আমি এটি হ্যামক্রাস্টে বেশি পছন্দ করি।
ডেভিডএক্সএক্সএক্সএক্স

আমার মতে এটি কিছুটা কম পঠনযোগ্য কারণ এটি "প্রত্যাশিত মান" থেকে "প্রকৃত মান" পৃথক করে এবং মেলানো দরকার এমন ক্রমে রাখে।
তেরান

5

যতক্ষণ না আপনার তালিকাটি একটি কংক্রিট শ্রেণি, আপনি যতক্ষণ না আপনি মাই আইটেমে আপনার সমান () পদ্ধতিটি প্রয়োগ করেছেন ততক্ষণ আপনি কেবল () পদ্ধতিটি কল করতে পারবেন।

// given 
// some input ... you to complete

// when
List<MyItems> results = service.getMyItems();

// then
assertTrue(results.contains(new MyItem("foo")));
assertTrue(results.contains(new MyItem("bar")));

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


1
আমি আপনার সমাধানটি সত্যিই পছন্দ করি তবে তার কি কোনও পরীক্ষার জন্য এই কোডটি মোড করা উচিত?
কেভিন বোয়ার্সক্স

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

AssertTrue এর মধ্যে কোনও বার্তা অন্তর্ভুক্ত করা ভাল তবে যাতে ত্রুটি বার্তাটি আরও বোধগম্য হয়। কোনও বার্তা ছাড়াই, যদি এটি ব্যর্থ হয়, JUnit কোনও ত্রুটি বার্তা ছাড়াই কেবল একটি AssertionFailedError নিক্ষেপ করবে। "ফলাফলগুলিতে নতুন মাই আইটেম (\" ফু \ ") থাকা উচিত" এর মতো কিছু অন্তর্ভুক্ত করা ভাল।
সর্বোচ্চ

হ্যাঁ তুমিই ঠিক. আমি যে কোনও ক্ষেত্রে হ্যামক্রস্টের পরামর্শ দেব, এবং আমি এই দিনগুলিতে কখনও এ্যাসেটট্রু () ব্যবহার করি না
ব্র্যাড

একপাশে লক্ষ্য করুন আপনার পোজো বা ডিটিওর সমান পদ্ধতিটি সংজ্ঞায়িত করা উচিত
তাইব হুসেন

1

AssertJ 3.9.1 anyMatchপদ্ধতিতে সরাসরি ভবিষ্যদ্বাণীপূর্ণ ব্যবহার সমর্থন করে ।

assertThat(collection).anyMatch(element -> element.someProperty.satisfiesSomeCondition())

এটি ইচ্ছামত জটিল অবস্থার জন্য উপযুক্ত ব্যবহারের ক্ষেত্রে।

সাধারণ অবস্থার জন্য আমি extractingপদ্ধতিটি ব্যবহার করতে পছন্দ করি (উপরে দেখুন) কারণ পুনরাবৃত্ত-অধীন-পরীক্ষার ফলে আরও ভাল পাঠযোগ্যতার সাথে মান যাচাইকরণকে সমর্থন করা যেতে পারে। উদাহরণ: এটি containsফ্র্যাঙ্ক নেবলং এর উত্তরে পদ্ধতি হিসাবে বিশেষায়িত এপিআই সরবরাহ করতে পারে। অথবা আপনি anyMatchপরে যাইহোক এটিতে কল করতে পারেন এবং পদ্ধতি রেফারেন্স যেমন ব্যবহার করতে পারেন "searchedvalue"::equals। এছাড়াও একাধিক এক্সট্র্যাক্টর extractingপদ্ধতিতে রাখা যেতে পারে , ফলস্বরূপ ব্যবহার করে যাচাই করা tuple()

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.