4.1 পদ্ধতির পরামিতি
পরামিতি ছাড়া পদ্ধতির সাথে মোকাবিলা করা উপহাস বস্তুতে যুক্ত পূর্ববর্তী নিয়ম। এবং কিভাবে প্যারামিটার সহ পদ্ধতির জন্য নিয়ম তৈরি করবেন? তদুপরি, আমি নিয়ম তৈরি করতে চাই যাতে কিছু প্যারামিটার মানগুলির জন্য একটি ফলাফল থাকে এবং অন্যদের জন্য - অন্য।
যেভাবে আপনিও এটি করতে পারেন। আপনি যদি পদ্ধতিটি একটি নির্দিষ্ট প্যারামিটার সহ নির্দিষ্ট কিছু ফেরত দিতে চান তবে নিয়মটি এভাবে লেখা যেতে পারে:
Mockito.doReturn(result).when(an object).method name(parameter);
আসুন আরও ভালভাবে বোঝার জন্য একটি উদাহরণ দেখি। আমাদের তালিকাটি 10 তম উপাদানটির অনুরোধ করার সময় ইভান নামটি এবং 500 তম উপাদানটির জন্য অনুরোধ করার সময় মরিয় নামটি ফেরত দিন৷ যত তাড়াতাড়ি বলা হয়ে গেল।
@ExtendWith(MockitoExtension.class)
class ParamsTest {
@Mock
List mockList;
@Test
public void whenMockAnnotation() {
//adding the first rule
Mockito.doReturn("Ivan").when(mockList).get(10);
//adding a second rule
Mockito.doReturn("Maria").when(mockList).get(500);
assertEquals("Ivan", mockList.get(10));
assertEquals("Maria", mockList.get(500));
}
}
4.2 প্যারামিটার টেমপ্লেট
এবং অবিলম্বে ধূর্ত সহকর্মীরা আমাকে এই প্রশ্নটি জিজ্ঞাসা করবে: "যদি পদ্ধতিটির আর্গুমেন্টের প্রয়োজন হয় তবে কী হবে, তবে কোনও মানের জন্য এটি অবশ্যই একই ফলাফল দিতে হবে?"। আসুন না লিখি:
Mockito.doReturn("Ivan").when(mockList).get(1);
Mockito.doReturn("Ivan").when(mockList).get(2);
Mockito.doReturn("Ivan").when(mockList).get(99);
না, কেউ আপনাকে এভাবে লিখতে বাধ্য করছে না। আপনি যদি একটি মক অবজেক্টে একটি নিয়ম যুক্ত করতে চান যা কোনও আর্গুমেন্ট সহ একটি পদ্ধতির জন্য কাজ করে, তবে এর জন্য একটি বিশেষ বস্তু রয়েছে:
Mockito.any()
এটির সাথে আমাদের উদাহরণটি এভাবে লেখা হবে:
Mockito.doReturn("Ivan").when(mockList).get(any(int.class));
এখানে কয়েকটি সূক্ষ্মতা রয়েছে। বস্তুটির Mockito.any()
প্রকার আছে Object
, তাই বিভিন্ন ধরণের পরামিতির জন্য অ্যানালগ রয়েছে:
পদ্ধতি | পরামিতি প্রকার | |
---|---|---|
1 | যেকোনো() | শূন্য সহ অবজেক্ট |
2 | any(ClassName.class) | শ্রেণির নাম |
3 | anyInt() | int |
4 | যেকোনো বুলিয়ান() | বুলিয়ান |
5 | যেকোনো ডাবল() | দ্বিগুণ |
6 | যেকোনো তালিকা() | তালিকা |
আরো সঠিকভাবে, আমাদের উদাহরণ এই মত দেখাবে:
Mockito.doReturn("Ivan").when(mockList).get(anyInt());
4.3 doAnswer() পদ্ধতি
আমরা ভার্চুয়াল পদ্ধতি জটিল আচরণ পেয়েছিলাম. শীঘ্রই বা পরে এমন একটি পরিস্থিতি হবে যখন আপনি এই ভার্চুয়াল পদ্ধতিতে জটিল আচরণ করতে চান। উদাহরণস্বরূপ, এটি পরামিতিগুলির উপর নির্ভর করে মানগুলি প্রদান করবে, স্ট্রিংটিকে বড় হাতের অক্ষরে রূপান্তর করবে।
এর জন্য একটি বিশেষ পদ্ধতি রয়েছে - doAnswer()
, যা একটি ফাংশন পাস করা হয় যা আপনার যা প্রয়োজন তা করে:
Mockito.doAnswer(function).when(an object).method name(parameter);
চলুন get()
ক্লাস পদ্ধতিটি List
এটিতে পাস করা আর্গুমেন্টের বর্গকে ফিরিয়ে দেওয়া যাক। এবং নিম্নলিখিত প্রোগ্রাম লিখুন:
@ExtendWith(MockitoExtension.class)
class DoAnswerTest {
@Mock
List mockList;
@Test
public void whenMockAnnotation() {
Mockito.doAnswer(invocation -> {
int parameter = invocation.getArgument(0);
return parameter * parameter;
}).when(mockList).get(anyInt());
assertEquals(100, mockList.get(10));
assertEquals(25, mockList.get(5));
}
}
আমরা উত্তর ক্লাসের একটি অবজেক্ট ব্যবহার করে ফাংশনটি সংজ্ঞায়িত করেছি।