Mockito একটি জনপ্রিয় Java mocking ফ্রেমওয়ার্ক যা টেস্টিংয়ের জন্য মক (mock) অবজেক্ট তৈরি করতে ব্যবহৃত হয়। এটি ইউনিট টেস্টিংয়ের জন্য একটি গুরুত্বপূর্ণ টুল, বিশেষ করে যখন আপনার কোড ফাংশনাল ইন্টারফেস (Functional Interface) ব্যবহার করছে এবং আপনি তার উপর টেস্ট কেস তৈরি করতে চান।
Functional Interfaces হল এমন ইন্টারফেস যা শুধুমাত্র একটি অ্যাবস্ট্রাক্ট মেথড ধারণ করে এবং Java 8 থেকে lambda expressions অথবা method references এর মাধ্যমে তাদের ব্যবহার করা হয়। Mockito আপনাকে এই ধরনের Functional Interfaces মক করতে সহায়তা করতে পারে, যাতে আপনি নির্দিষ্ট কার্যাবলী পরীক্ষা করতে পারেন এবং কোন আসল ইমপ্লিমেন্টেশন ছাড়াই কাজ করতে পারেন।
এই লেখায়, আমরা Mockito ব্যবহার করে Functional Interfaces এর মকিং কিভাবে করা যায় তা দেখবো।
Mockito ব্যবহার করে Functional Interface Mocking
Functional Interface মক করার জন্য, Mockito এর কিছু বিশেষ বৈশিষ্ট্য, যেমন Mockito.mock() বা Mockito.when() ব্যবহার করা হয়।
Functional Interface এর উদাহরণ:
ধরা যাক, আমাদের একটি Functional Interface রয়েছে, যার মাধ্যমে একটি নাম স্ট্রিংয়ের দৈর্ঘ্য বের করা হয়:
@FunctionalInterface
public interface StringLength {
int getLength(String input);
}
এটি একটি Functional Interface, যা একটি String আর্গুমেন্ট নিয়ে একটি int রিটার্ন করে। এখন, আমরা এই ইন্টারফেসের মক (mock) তৈরি করে এর উপর টেস্ট কেস লিখব।
Mockito ব্যবহার করে Functional Interface Mocking উদাহরণ
Step 1: Mockito Dependancy
প্রথমে, আপনার pom.xml ফাইলে Mockito এর dependency যোগ করতে হবে (যদি Maven ব্যবহার করেন):
<dependencies>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>4.8.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.8.2</version>
<scope>test</scope>
</dependency>
</dependencies>
Step 2: Functional Interface Mocking Using Mockito
এখন, আমরা Mockito ব্যবহার করে StringLength ফাংশনাল ইন্টারফেস মক করব এবং এর উপর টেস্ট কেস প্রয়োগ করব।
import static org.mockito.Mockito.*;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
public class MockitoFunctionalInterfaceTest {
@Test
public void testFunctionalInterfaceMocking() {
// Mocking the Functional Interface
StringLength mockStringLength = mock(StringLength.class);
// Stubbing the method using Mockito.when()
when(mockStringLength.getLength("Hello")).thenReturn(5);
when(mockStringLength.getLength("Java")).thenReturn(4);
// Verifying the mocked method behavior
assertEquals(5, mockStringLength.getLength("Hello"));
assertEquals(4, mockStringLength.getLength("Java"));
// Verifying interactions with the mock
verify(mockStringLength).getLength("Hello");
verify(mockStringLength).getLength("Java");
}
}
ব্যাখ্যা:
- Mockito.mock(): আমরা
mock(StringLength.class)ব্যবহার করেStringLengthইন্টারফেসের একটি মক অবজেক্ট তৈরি করেছি। - Mockito.when():
when(mockStringLength.getLength("Hello")).thenReturn(5)দিয়ে আমরা নির্দিষ্ট ইনপুট (যেমন "Hello") এর জন্য মক অবজেক্টে ফেরত আসা ভ্যালু (যেমন 5) নির্ধারণ করেছি। - assertEquals(): টেস্ট কেসে আমরা
assertEquals()ব্যবহার করে নিশ্চিত করেছি যে মক অবজেক্টটি সঠিকভাবে কাজ করছে। - verify():
verify()মেথড দিয়ে নিশ্চিত করা হয়েছে যে মক অবজেক্টটির getLength() মেথডটি সঠিকভাবে কল হয়েছে।
Mockito Mocking with Lambda Expressions
আমরা lambda expressions এর মাধ্যমে সরাসরি Functional Interfaces মক করতে পারি। আসুন দেখি কিভাবে:
import static org.mockito.Mockito.*;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
public class MockitoFunctionalInterfaceTest {
@Test
public void testFunctionalInterfaceMockingWithLambda() {
// Mocking the Functional Interface using lambda expression
StringLength mockStringLength = mock(StringLength.class);
// Stubbing the method using Mockito.when()
when(mockStringLength.getLength(anyString())).thenAnswer(invocation -> {
String input = invocation.getArgument(0);
return input.length(); // Return the length of the input string
});
// Verifying the mocked method behavior
assertEquals(5, mockStringLength.getLength("Hello"));
assertEquals(4, mockStringLength.getLength("Java"));
// Verifying interactions with the mock
verify(mockStringLength).getLength("Hello");
verify(mockStringLength).getLength("Java");
}
}
ব্যাখ্যা:
- এখানে lambda expression ব্যবহার করা হয়েছে
when().thenAnswer()এর মাধ্যমে, যাতে mocked method কার্যকরী হয় এবং ইনপুট অনুযায়ী আউটপুট প্রদান করে। invocation.getArgument(0)দিয়ে ইনপুট স্ট্রিংটি নেয়া হয়েছে এবং তার দৈর্ঘ্য রিটার্ন করা হয়েছে।
Mockito with Functional Interfaces: Benefits
- Testing Lambda-based Functional Interfaces:
- Mockito ব্যবহারের মাধ্যমে lambda expressions এবং functional interfaces এর উপর টেস্টিং সহজ করা যায়, যা Java 8 এবং পরবর্তী সংস্করণের functional programming ফিচারগুলির সাথে কাজ করার সময় অপরিহার্য।
- Flexible Test Creation:
- Mockito ফাংশনাল ইন্টারফেসের মক তৈরি এবং তাদের আচরণ পরীক্ষা করতে সহায়ক, ফলে টেস্টিং আরও ফ্লেক্সিবল এবং মডুলার হয়।
- Mocking Interfaces Without Implementations:
- আপনি মক অবজেক্টের মাধ্যমে ফাংশনাল ইন্টারফেস পরীক্ষা করতে পারেন, এমনকি তাদের কোনো নির্দিষ্ট বাস্তবায়ন না থাকলেও। এতে টেস্টিং কোডের গতি বাড়ে এবং কোড ক্লিন থাকে।
Mockito ব্যবহার করে Functional Interfaces মক করা সম্ভব এবং এটি Java 8 এবং পরবর্তী সংস্করণে lambda expressions এর মাধ্যমে কার্যকরী হয়। আপনি Mockito এর mock(), when(), verify(), এবং thenAnswer() মেথডগুলির মাধ্যমে Functional Interfaces মক করতে পারেন এবং তাদের আচরণ পরীক্ষা করতে পারেন। এতে ইউনিট টেস্টিং আরো সহজ এবং ফ্লেক্সিবল হয়, এবং আপনি একটি নির্দিষ্ট কার্যাবলীর সঠিকতা নিশ্চিত করতে পারেন।
Read more