মকিতো - doReturn () এবং কখন () এর মধ্যে পার্থক্য


196

আমি বর্তমানে একটি স্প্রিং এমভিসি অ্যাপ্লিকেশনটিতে আমার পরিষেবা লেয়ার অবজেক্টগুলিকে বিদ্রূপ করার জন্য মকিতো ব্যবহার করার প্রক্রিয়াতে রয়েছি যাতে আমি আমার কন্ট্রোলার পদ্ধতিগুলি পরীক্ষা করতে চাই। যাইহোক, আমি মকিতোর সুনির্দিষ্ট বিবরণগুলি পড়তে গিয়ে দেখলাম যে পদ্ধতিগুলি doReturn(...).when(...)সমান when(...).thenReturn(...)। সুতরাং, আমার প্রশ্নটি হল যে দুটি পদ্ধতি একই জিনিস করে বা কী doReturn(...).when(...)এবং এর মধ্যে সূক্ষ্ম পার্থক্য when(...).thenReturn(...)কী?

কোন সাহায্য প্রশংসা করা হবে।


1
জাভাডোকের কয়েকটি ক্ষেত্রে doReturn()দরকারী যেখানে কার্যকর।
সোটিরিওস ডেলিমনোলিস

5
আমি মনে করি যে মূল পার্থক্যের মধ্যে একটি হ'ল ডর্টার্ন (...) when যখন (..) .তখন পুনরায় (..) সুরক্ষা প্রকারের দিক থেকে অনেক ভাল
ব্যবহারকারী 2511882

উত্তর:


227

স্টাবের জন্য দুটি বাক্য গঠন প্রায় সমান। যাইহোক, আপনি সর্বদাdoReturn/when খড়ের জন্য ব্যবহার করতে পারেন ; তবে এমন কিছু ঘটনা রয়েছে যেখানে আপনি ব্যবহার করতে পারবেন নাwhen/thenReturn । অনড় শূন্য পদ্ধতিগুলি এর মধ্যে একটি। অন্যদের মধ্যে মকিতো গুপ্তচরদের ব্যবহার এবং একাধিকবার একই পদ্ধতিতে স্ট্যাবি করা অন্তর্ভুক্ত রয়েছে।

একটি জিনিস যা when/thenReturnআপনাকে দেয় doReturn/whenতা হ'ল সংকলনের সময় আপনি যে মূল্যটি ফিরিয়ে দিচ্ছেন তা টাইপ-চেক করা। তবে, আমি বিশ্বাস করি এটি প্রায় কোনও মূল্য নয় - আপনি যদি টাইপটি ভুল করে ফেলে থাকেন তবে আপনি পরীক্ষা চালানোর সাথে সাথেই আপনি খুঁজে পাবেন।

আমি দৃ strongly়ভাবে কেবল ব্যবহার করার পরামর্শ দিচ্ছি doReturn/when। দুটি সিনট্যাক্স শেখার কোনও মানে নেই যখন কেউ এটি করবে।

আপনি আমার উত্তরটি ফর্মিং মকিতো "ব্যাকরণ" এ উল্লেখ করতে ইচ্ছুক হতে পারেন - খুব ঘনিষ্ঠভাবে সম্পর্কিত প্রশ্নের আরও বিশদ উত্তর।


16
আমি ডেভিডের সাথে একমত নই। আমি প্রায়শই এমন পরিস্থিতিতে চলে যাই যেখানে ব্যবহার করার সময় আমি ভুল টাইপটি ফিরে আসি doReturn/whenএবং কী কী ঘটেছে তা ভেবে পরবর্তী কয়েক মিনিট ব্যয় করি। সংকলন প্রকারের পরীক্ষা করা অত্যন্ত কার্যকর হয়ে ওঠে when/thenReturn
সায়েত

11
কেবল মনে রাখবেন যে মকিতো আপনাকে when/thenReturnপরিবর্তে ব্যবহারের পরামর্শ দেয় doReturn/when
কোডিঞ্জেল

2
@CodyEngel এবং সেখানে এই ধরনের একটি সুপারিশ জন্য কোনো কারণ, আমি কি আমার উত্তর এখানে এবং এ রূপরেখা থাকেন ছাড়া অন্য stackoverflow.com/q/11462697 । বেশ কয়েক বছর আগে, আমি ব্রাস দুথিলের সাথে এটি নিয়ে আলোচনা করেছি, যিনি বর্তমানে মকিতোর লিড বিকাশকারী হিসাবে অভিনয় করছেন এবং আমার স্মৃতিতে সর্বোত্তমভাবে তিনি সম্মত হন। আমি তাকে এখানে একটি মন্তব্য পোস্ট করতে বলব (তিনি এমনটি করবেন কিনা তার কোনও গ্যারান্টি নেই)।
দাউদ ইবনে কেরেম

18
Javadoc বলে যে doReturn/whenএকটি ট্রেড বন্ধ আছে। দলটি অন্য কোনও উপায়ে পুনঃনির্মাণ না করে তবে নোটটি when/thenআরও স্বজ্ঞাত, আরও পাঠযোগ্য এবং কমপিলে টাইম চেকের প্রস্তাব রাখে, এটি এমন দৃষ্টিভঙ্গি যা মকিতোকে জনপ্রিয় এবং সহজেই ব্যবহারযোগ্য করে তুলেছে, ভুলে যাবেন না যে যখন কোড বেসটি ভাগ করে নেওয়া হয়েছে আপনার দলে বিভিন্ন দক্ষতা; তবুও এটি গুপ্তচর এবং অকার্যকর পদ্ধতি সম্পর্কিত ত্রুটি রয়েছে।
ব্রিস

5
কেবল রেকর্ডের জন্য: পদ্ধতি কলগুলির YODA স্টাইল কোডিংয়ে পরিণত doReturn()করার বড় অসুবিধা রয়েছে। জিনিসটি পরে লিখিত আসে যা প্রথমে। বেশিরভাগ মানুষ বাম থেকে ডান পড়েন; সুতরাং আপনার এখন মাথার মধ্যে ফিরতি-যুক্তিটি বিপরীত করতে ক্রমাগত মনে রাখতে হবে।
ঘোস্টট্যাগ

199

উভয় পন্থা আলাদাভাবে আচরণ করে যদি আপনি @Spyকোন উপহাসের পরিবর্তে কোনও স্পাই অবজেক্ট (এর সাথে টিকা দেওয়া ) ব্যবহার করেন @Mock:

  • when(...) thenReturn(...) নির্দিষ্ট মানটি ফিরে আসার ঠিক আগে একটি আসল পদ্ধতি কল করে। সুতরাং যদি তথাকথিত পদ্ধতিটি একটি ব্যতিক্রম ছোঁড়ে তবে আপনাকে এটি মোকাবেলা করতে হবে / এটি উপহাস করতে হবে ইত্যাদি অবশ্যই অবশ্যই আপনি আপনার ফলাফল পেয়েছেন (আপনি কী সংজ্ঞায়িত করেছেন thenReturn(...))

  • doReturn(...) when(...) পদ্ধতিটি একেবারেই কল করে না

উদাহরণ:

public class MyClass {
     protected String methodToBeTested() {
           return anotherMethodInClass();
     }

     protected String anotherMethodInClass() {
          throw new NullPointerException();
     }
}

টেস্ট:

@Spy
private MyClass myClass;

// ...

// would work fine
doReturn("test").when(myClass).anotherMethodInClass();

// would throw a NullPointerException
when(myClass.anotherMethodInClass()).thenReturn("test");

37
এই আচরণটি স্পাইযুক্ত বস্তুর জন্য কাজ করে, যেহেতু বাস্তব বস্তুর "মোড়ক"। বিদ্রূপযুক্ত বস্তুর ক্ষেত্রে, এটি কখন / তারপরে রিটার্ন বা ডু রিটারন / কখন তা বিবেচনা করে না। ঠাট্টা করা বস্তু কখনই আসল পদ্ধতিগুলিতে কল করে না।
রাফায়েল ওরেজিও

আপনি দয়া করে আরও তথ্য দিতে পারেন কেন আমাদের এই কার্যকারিতাটি ব্যবহারের দরকার? আমি ব্যবহারিক ব্যবহারের ক্ষেত্রে দেখতে পাচ্ছি না। পরীক্ষার অভিপ্রায় হ'ল বিভিন্ন ব্যবহারের ক্ষেত্রে কোডের সঠিকতা নিশ্চিত করা। যদি পদ্ধতির
কলটি

@ গ্লাইচমুট এটি একটি কাল্পনিক দৃশ্য ছিল, যেখানে আমি doReturn এর ব্যবহার / সুবিধা দেখায়। সত্যিকারের প্রয়োগে, একটি পদ্ধতি যা কেবলমাত্র একটি ব্যতিক্রম প্রত্যাবর্তন করে তা অবশ্যই কোনও বোধগম্য করে না .. তবে আপনার কাছে এমন পদ্ধতি রয়েছে (সম্ভবত
এটির

1
কেবল স্পষ্টকরণের জন্য: কখন () .পরে রিটার্ন () - পদ্ধতিটি একবারে আসল পদ্ধতিটিকে (একজন গুপ্তচর হিসাবে - ব্যঙ্গ করে না) ডাকে। আপনি যে লৌকিক আচরণটি নির্দিষ্ট করেছেন সেই লাইনে এটি ঘটে (যখন ( myClass.anotherMethodInClass () .পেন রিট ...)। এর পরে আসল পদ্ধতিটি আর কখনও কল করা হয় না explanation ব্যাখ্যাটি পড়ার পরে আপনি কিছু সজ্জা যুক্তির প্রত্যাশা রেখেছিলেন কিনা তা জানা ভাল Maybe উপরে।
জোনাস

এটি কোনও সুবিধার মতো বলে মনে হচ্ছে না doReturn(), এটি লাইব্রেরির অপব্যবহারের মতো দেখাচ্ছে। খাঁটি উপহাসের পরিবর্তে গুপ্তচরবৃত্তির বিষয়টি হ'ল আসল কলগুলির সুবিধা নেওয়া। তারা গুপ্তচরদের এই জাতীয় ব্যবহারের বিরুদ্ধে সতর্কও করে : github.com/mockito/mockito/wiki/Using-Spies- ( এবং- নকল) (এবং ক্লাস প্রসারিত এবং পরিবর্তে পদ্ধতিটি ওভাররাইড করার পরামর্শ দেয়)
ম্যাথু

13

মকিতো জাভাদোক আপনাকে মকিতো.ওহেন (অবজেক্ট) ব্যবহার করতে পারবেন না এমন বিরল ইভেন্টগুলিতে কেন ব্যবহারের doReturn()বদলে ব্যবহার when()করুন ডেট রিটার্ন () ব্যবহার করবেন বলে মনে হচ্ছে tell

সাবধান থাকুন যে মকিতো.ওহেন (অবজেক্ট) সর্বদা স্টাবের জন্য সুপারিশ করা হয় কারণ এটি আর্গুমেন্ট টাইপ-নিরাপদ এবং আরও পঠনযোগ্য (বিশেষত পরপর কলগুলিতে স্ট্যাবিং করার সময়)।

যখন দ্য রিটার্ন () কাজে আসে তখন এই বিরল ঘটনাগুলি এখানে:

১. আসল বস্তুগুলির গুপ্তচরবৃত্তি করার সময় এবং কোনও গুপ্তচরকে বাস্তব পদ্ধতি কল করার সময় পার্শ্ব প্রতিক্রিয়া হয়

List list = new LinkedList(); List spy = spy(list);

// অসম্ভব: বাস্তব পদ্ধতিটিকে তাই স্পাই.জেট বলা হয় (0) সূচক ছুঁড়ে ফেলেছে অফব্যান্ডসেক্সশন (তালিকাটি এখনও খালি রয়েছে)

when(spy.get(0)).thenReturn("foo");

// খড়ের জন্য আপনাকে doReturn () ব্যবহার করতে হবে: doReturn("foo").when(spy).get(0);

২. পূর্ববর্তী ব্যতিক্রম-স্টাবিংকে ওভাররাইড করা:

when(mock.foo()).thenThrow(new RuntimeException());

// অসম্ভব: ব্যতিক্রম-স্টাবড ফু () পদ্ধতিটিকে তাই রানটাইমএক্সেপশন নিক্ষেপ করা হয়। when(mock.foo()).thenReturn("bar");

// খড়ের জন্য আপনাকে doReturn () ব্যবহার করতে হবে:

doReturn("bar").when(mock).foo(); উপরের পরিস্থিতিতে মকিতোর মার্জিত সিনট্যাক্সের একটি ট্রেড অফ দেখায়। নোট করুন যে পরিস্থিতিতে যদিও খুব বিরল। গুপ্তচরবৃত্তি ছড়িয়ে ছিটিয়ে থাকা এবং ওভাররাইডিং ব্যতিক্রম-স্টাবিং খুব বিরল হওয়া উচিত। উল্লেখ করার দরকার নেই যে সাধারণভাবে ওভাররিডিং স্টুবিং হ'ল একটি সম্ভাব্য কোড গন্ধ যা খুব বেশি স্টাবিংকে নির্দেশ করে।


6

এই উত্তরটি অব্যাহত রাখা , আরও একটি পার্থক্য রয়েছে যে আপনি যদি চান যে আপনার পদ্ধতিটি যখন প্রথমবার বলা হয়, দ্বিতীয়বার বলা হয় ইত্যাদি উদাহরণস্বরূপ বিভিন্ন মানগুলি ফিরিয়ে দেয় তবে আপনি উদাহরণগুলি যেমন পাস করতে পারেন ...

PowerMockito.doReturn(false, false, true).when(SomeClass.class, "SomeMethod", Matchers.any(SomeClass.class));

সুতরাং পদ্ধতিটিকে একই পরীক্ষার ক্ষেত্রে ডাকা হলে এটি মিথ্যা ফিরে আসবে এবং তারপরে এটি আবার মিথ্যা এবং শেষ পর্যন্ত সত্য হবে return


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