EasyMock একটি জনপ্রিয় mocking framework যা JUnit এর সাথে ব্যবহৃত হয়ে unit testing এর জন্য mock objects তৈরি করতে সাহায্য করে। verify() মেথড ব্যবহার করে আমরা নিশ্চিত করতে পারি যে আমাদের mock objects নির্দিষ্টভাবে কাজ করেছে এবং তাদের আচরণ সঠিকভাবে সম্পন্ন হয়েছে। তবে, verify() মেথডের ব্যবহার কিছু ক্ষেত্রে ব্যতিক্রম (exception) এবং error handling সম্পর্কিত সমস্যা সৃষ্টি করতে পারে। এই গাইডে আমরা EasyMock এর verify() মেথডের ব্যতিক্রম এবং error handling নিয়ে আলোচনা করব।
1. EasyMock: verify() মেথডের ব্যতিক্রম
verify() মেথডটি মূলত mock objects-এ নির্ধারিত কার্যকলাপের উপর ভিত্তি করে পরীক্ষা করার জন্য ব্যবহৃত হয়। এটি পরীক্ষা করে যে mock object এর কোনো নির্দিষ্ট মেথড প্রত্যাশিতভাবে কতবার কল হয়েছে। যদি mock object এর মেথডের আচরণ প্রত্যাশিত না হয়, তাহলে verify() একটি AssertionError বা ExpectationError তৈরি করতে পারে।
verify() মেথডের ব্যতিক্রম হতে পারে যখন:
- Mock Object এর মেথড কল হয়নি:
- যদি mock object-এর নির্দিষ্ট কোনো মেথড প্রত্যাশিতভাবে কল না করা হয়, তবে
verify()ত্রুটি সৃষ্টি করবে।
- যদি mock object-এর নির্দিষ্ট কোনো মেথড প্রত্যাশিতভাবে কল না করা হয়, তবে
- Mock Object এর মেথড অতিরিক্তভাবে কল হয়েছে:
- যদি mock object-এর মেথড প্রত্যাশিত সংখ্যার থেকে বেশি বার কল হয়, তবে
verify()ত্রুটি দেখাবে।
- যদি mock object-এর মেথড প্রত্যাশিত সংখ্যার থেকে বেশি বার কল হয়, তবে
- Mock Object-এর মেথডের আচরণ ঠিকমতো না বাস্তবায়িত হলে:
expect()মেথডে নির্ধারিত আচরণটি ঠিকভাবে বাস্তবায়িত না হলেverify()ব্যতিক্রম তৈরি করবে।
2. verify() মেথডের ব্যতিক্রমের উদাহরণ
ধরা যাক, আমাদের একটি PaymentService ক্লাস রয়েছে যা processPayment মেথডের মাধ্যমে পেমেন্ট প্রক্রিয়া পরিচালনা করে। আমরা একটি mock অবজেক্ট ব্যবহার করে যাচাই করতে চাই যে processPayment মেথডটি সঠিকভাবে একবার কল হয়েছে।
1. অভিপ্রেত আচরণ:
import static org.easymock.EasyMock.*;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.*;
public class PaymentServiceTest {
private PaymentService mockPaymentService;
@Before
public void setUp() {
// Mock object তৈরি
mockPaymentService = createMock(PaymentService.class);
}
@Test
public void testProcessPayment() {
// Expectation সেট করা
expect(mockPaymentService.processPayment(100.0)).andReturn(true);
// Mock সক্রিয় করা
replay(mockPaymentService);
// টেস্ট কোড
boolean paymentStatus = mockPaymentService.processPayment(100.0);
assertTrue(paymentStatus);
// verify() মেথড ব্যবহার করে ব্যতিক্রম যাচাই
verify(mockPaymentService); // এটি একবার কল হওয়া উচিত
}
}
Explanation:
- এখানে,
expect()মেথড ব্যবহার করে processPayment মেথডের জন্য প্রত্যাশিত আচরণ নির্ধারণ করা হয়েছে। replay()মেথডে mocks সক্রিয় করা হয়েছে, এবং এরপরverify()মেথডে এটি পরীক্ষা করা হয়েছে যে processPayment(100.0) একবার কল হয়েছে কিনা।
2. ব্যতিক্রম উদাহরণ: মেথড একাধিক বার কল হয়েছে
@Test(expected = AssertionError.class)
public void testProcessPayment_CalledMultipleTimes() {
// Expectation সেট করা
expect(mockPaymentService.processPayment(100.0)).andReturn(true);
expect(mockPaymentService.processPayment(200.0)).andReturn(true);
// Mock সক্রিয় করা
replay(mockPaymentService);
// টেস্ট কোড (প্রত্যাশিত আচরণ অনুযায়ী দুইবার কল হচ্ছে)
mockPaymentService.processPayment(100.0);
mockPaymentService.processPayment(100.0); // এটা ভুল
// verify() মেথডে ব্যতিক্রম হবে, কারণ processPayment দুইবার কল করা হয়েছে
verify(mockPaymentService);
}
Explanation:
- এখানে,
processPayment(100.0)মেথডটি একাধিক বার কল করা হয়েছে, কিন্তু আমাদের প্রত্যাশা ছিল এটি একবার কল হবে। তাই,verify()ত্রুটি সৃষ্টি করবে, যা AssertionError তৈরি করবে।
3. EasyMock এর ব্যতিক্রম এবং Error Handling
EasyMock-এ verify() মেথডের ব্যতিক্রম এবং error handling এর জন্য কিছু গুরুত্বপূর্ণ পদ্ধতি রয়েছে:
- Expectations:
- যখন
expect()মেথডের মাধ্যমে নির্ধারিত আচরণ ঠিকমতো পূর্ণ হয় না, তখন EasyMock ব্যতিক্রম তৈরি করে। তাই, verify() কল করার আগে expect() এর মাধ্যমে সব সেটআপ নিশ্চিত করতে হবে।
- যখন
- Verify the Correct Number of Calls:
verify()মেথডে স্পেসিফাই করা হয়েছে, কতবার মেথড কল হওয়া উচিত। যদি mock অবজেক্টের মেথডের কল সংখ্যা প্রত্যাশিত না হয়, তাহলে EasyMock ব্যতিক্রম (error) জানাবে।
- Clear Expectations:
reset()মেথড ব্যবহার করে পূর্ববর্তী mock অবজেক্টের আচরণ পরিষ্কার করা যেতে পারে, যাতে আগের কোনো এক্সপেক্টেশন বা রেকর্ডিং প্রভাবিত না করে।
4. Exception Handling with EasyMock
যখন mock অবজেক্টে ব্যতিক্রম (exception) ঘটানো হয়, তখন expect() এবং andThrow() মেথড ব্যবহার করে সেই exception নির্ধারণ করা যেতে পারে। এর মাধ্যমে আপনি এমন পরিস্থিতি তৈরি করতে পারেন যেখানে mock অবজেক্টটি নির্দিষ্ট সময়ের মধ্যে exception ছুঁড়ে ফেলবে।
Exception Handling Example:
@Test(expected = RuntimeException.class)
public void testProcessPayment_Exception() {
// Expectation set with exception
expect(mockPaymentService.processPayment(100.0)).andThrow(new RuntimeException("Payment failed"));
// Mock active
replay(mockPaymentService);
// This will throw RuntimeException
mockPaymentService.processPayment(100.0);
// verify the mock
verify(mockPaymentService);
}
Explanation:
- এখানে andThrow() ব্যবহার করা হয়েছে, যাতে processPayment মেথড কল করলে একটি RuntimeException ছুঁড়ে ফেলা হয়।
- verify() মেথডে আমরা নিশ্চিত করছি যে মক অবজেক্টটি প্রত্যাশিতভাবে ব্যবহার হয়েছে এবং exception সঠিকভাবে ছুঁড়ে ফেলেছে।
EasyMock এর মাধ্যমে verify() মেথড ব্যবহারে mock objects এর আচরণ যাচাই করা হয়, এবং যদি নির্দিষ্ট মেথড কলের সংখ্যা বা প্রত্যাশিত আচরণ না ঘটে, তাহলে এটি ব্যতিক্রম (exception) তৈরি করে। এই ব্যতিক্রমগুলি যেমন AssertionError বা ExpectationError আপনার টেস্টে সঠিক আচরণ নিশ্চিত করতে সাহায্য করে।
- verify() ব্যতিক্রমের মাধ্যমে নিশ্চিত করা যায় যে mock objects সঠিকভাবে ব্যবহার হয়েছে।
- EasyMock ব্যতিক্রমের মাধ্যমে কোডের স্থিতিশীলতা এবং কার্যকারিতা নিশ্চিত করা হয়, কারণ ভুল আচরণ বা অতিরিক্ত কল হওয়া থেকে রক্ষা পাওয়া যায়।
Read more