স্টুবিংয়ের জন্য আরগমেন্ট ক্যাপ্টর কীভাবে ব্যবহার করবেন?


161

Mockito ইন ডকুমেন্টেশন এবং javadocs এটা বলে

এটি আরবিউমেন্টক্যাপ্টর যাচাইয়ের সাথে ব্যবহার করার পরামর্শ দেওয়া হয় তবে স্টাবিংয়ের সাথে নয়।

তবে আমি বুঝতে পারি না কীভাবে আর্গুমেন্টক্যাপ্টর স্টাবের জন্য ব্যবহার করা যেতে পারে। কেউ কি উপরের বিবৃতিটি ব্যাখ্যা করতে পারেন এবং কীভাবে আর্গুমেন্টক্যাপ্টরকে আঘাত করতে ব্যবহার করা যেতে পারে বা একটি লিঙ্ক সরবরাহ করতে পারে যা দেখায় যে এটি কীভাবে করা যেতে পারে?


1
এখানে সুপার সংক্ষিপ্ত এবং দুর্দান্ত ব্যাখ্যা: dzone.com/articles/…
বেঞ্জ

উত্তর:


271

নিম্নলিখিত পদ্ধতিটি পরীক্ষা করে নিচ্ছেন:

public boolean doSomething(SomeClass arg);

মকিতো ডকুমেন্টেশন বলছে যে আপনাকে এইভাবে বন্দিদশা ব্যবহার করা উচিত নয় :

when(someObject.doSomething(argumentCaptor.capture())).thenReturn(true);
assertThat(argumentCaptor.getValue(), equalTo(expected));

কারণ আপনি স্টাবিংয়ের সময় কেবল ম্যাচার ব্যবহার করতে পারেন:

when(someObject.doSomething(eq(expected))).thenReturn(true);

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

ArgumentCaptor<SomeClass> argumentCaptor = ArgumentCaptor.forClass(SomeClass.class);
verify(someObject).doSomething(argumentCaptor.capture());
assertThat(argumentCaptor.getValue(), equalTo(expected));

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

এইচএম, আমি বিশ্বাস করি আপনি বোঝাতে চেয়েছিলেন "তবে তৃতীয় কোড ব্লকে কখন সত্য আসবে ?" তৃতীয় কোড ব্লকে আমরা কেবলমাত্র রিটার্ন মানটির যত্ন নেই এবং এটি একটি ডিফল্ট হতে দিন। বুলিয়ান জন্য false, না true
ররিক

না আমি সমস্ত ধূসর ব্যাকগ্রাউন্ড ব্লককে কোড ব্লক হিসাবে গণনা করেছি। প্রথম একটি লাইনার সহ। আমি লাইনটি উল্লেখ করছিলাম যখন (someObject.doSomething (arguCaptor.capture ())) ।পরে পুনরায় (সত্য);
বলতে পারবেন না

ওহ দুঃখিত. হ্যাঁ, এই ক্ষেত্রে সত্যটি সর্বদা ফিরে আসবে।
রিক

3
নিশ্চিত না যে "স্টাবিংয়ের সাথে ব্যবহার না করার" কারণ একটি সহজ কারণ। ম্যাথারস আমাদের আসল প্রত্যাশিত আর্গুমেন্ট দেয় না (কেবলমাত্র টাইপ) এবং ভুল হতে পারে এমন যুক্তি সত্ত্বেও পরীক্ষাগুলি পাস করে ঠিকঠাক হয়ে যায়।
dtc

0

লাইন

when(someObject.doSomething(argumentCaptor.capture())).thenReturn(true);

হিসাবে একই কাজ করবে

when(someObject.doSomething(Matchers.any())).thenReturn(true);

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

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


0

হাইপোটিকভাবে, যদি অনুসন্ধান আপনাকে এই প্রশ্নে নিয়ে আসে তবে আপনি সম্ভবত এটি চান:

doReturn(someReturn).when(someObject).doSomething(argThat(argument -> argument.getName().equals("Bob")));

কেন? কারণ আমার মতো আপনি সময়কে মূল্যবান বলে মনে করেন এবং আপনি .equalsকেবল একক পরীক্ষার দৃশ্যের জন্য বাস্তবায়ন করতে যাচ্ছেন না ।

এবং 99% পরীক্ষাগুলি মক থেকে ফিরে আসা নাল সাথে পৃথক হয়ে যায় এবং একটি যুক্তিসঙ্গত নকশায় আপনি কোনও nullমূল্যে ফিরতি এড়াতে পারবেন , ব্যবহার Optionalবা কোটলিনে চলে যাবেন। এটি বোঝায় যে verifyএটি ব্যবহার করার প্রয়োজন হয় না যে প্রায়শই এবং আর্গুমেন্টক্যাপ্টরগুলি লিখতে কেবল খুব ক্লান্তিকর হয়।

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