Mock Object Verification EasyMock এর একটি গুরুত্বপূর্ণ ফিচার, যা মক অবজেক্টের ব্যবহারের সঠিকতা পরীক্ষা করার জন্য ব্যবহৃত হয়। যখন আপনি মক অবজেক্ট তৈরি করেন এবং স্টাবিং করেন, তখন এটি নিশ্চিত করতে হবে যে সেই অবজেক্টটি সঠিকভাবে ব্যবহার হয়েছে। Verification পদ্ধতি আপনাকে এই কাজটি করতে সাহায্য করে।
EasyMock Verification আপনাকে পরীক্ষা করতে সহায়তা করে:
- কোন মেথড কল করা হয়েছে কিনা।
- সেই মেথড কতবার কল করা হয়েছে।
- সঠিক আর্গুমেন্টের সাথে মেথড কল হয়েছে কিনা।
1. মক অবজেক্টের জন্য Verification
Verification করার জন্য EasyMock.verify() মেথড ব্যবহার করা হয়। এটি নিশ্চিত করে যে, মক অবজেক্টের উপর নির্ধারিত আচরণ সঠিকভাবে এক্সিকিউট হয়েছে এবং সমস্ত প্রত্যাশিত মেথড কল হয়েছে।
2. উদাহরণ: EasyMock দিয়ে Mock Object Verification
এখানে একটি উদাহরণ দেওয়া হয়েছে যেখানে একটি Calculator ইন্টারফেস তৈরি করা হয়েছে, এবং তার মক অবজেক্ট তৈরি করা হয়েছে। পরে, Verification ব্যবহার করে মেথড কলের সঠিকতা পরীক্ষা করা হবে।
Step 1: Maven Dependency (যদি Maven ব্যবহার করা হয়)
যদি আপনি Maven ব্যবহার করেন, তাহলে pom.xml ফাইলে EasyMock ডিপেনডেন্সি যোগ করতে হবে।
<dependency>
<groupId>org.easymock</groupId>
<artifactId>easymock</artifactId>
<version>4.3</version> <!-- Latest version -->
<scope>test</scope>
</dependency>
Step 2: মক অবজেক্ট তৈরি এবং Verification
import org.easymock.EasyMock;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class EasyMockVerificationExample {
// Interface to be mocked
public interface Calculator {
int add(int a, int b);
int subtract(int a, int b);
}
@Test
public void testCalculatorVerification() {
// Step 1: Create a mock object for the Calculator interface
Calculator mockCalculator = EasyMock.createMock(Calculator.class);
// Step 2: Define the expected behavior for the mock object
EasyMock.expect(mockCalculator.add(2, 3)).andReturn(5); // Stubbing add method
EasyMock.expect(mockCalculator.subtract(5, 3)).andReturn(2); // Stubbing subtract method
// Step 3: Activate the mock object (switch to replay mode)
EasyMock.replay(mockCalculator);
// Step 4: Use the mock object
int additionResult = mockCalculator.add(2, 3);
int subtractionResult = mockCalculator.subtract(5, 3);
// Step 5: Assert the results
assertEquals(5, additionResult); // Test for add method
assertEquals(2, subtractionResult); // Test for subtract method
// Step 6: Verify that the mock object was used correctly
EasyMock.verify(mockCalculator); // Verify that methods were called as expected
}
}
3. ব্যাখ্যা
- Mock Object তৈরি:
EasyMock.createMock(Calculator.class)মেথডটিCalculatorইন্টারফেসের মক অবজেক্ট তৈরি করেছে।
- স্টাবিং (Stubbing):
EasyMock.expect(mockCalculator.add(2, 3)).andReturn(5)এবংEasyMock.expect(mockCalculator.subtract(5, 3)).andReturn(2)দিয়ে মক অবজেক্টের জন্য প্রত্যাশিত আচরণ নির্ধারণ করা হয়েছে।
- রিপ্লে (Replay):
EasyMock.replay(mockCalculator)মেথডটি মক অবজেক্টের আচরণ সক্রিয় করে দেয়, এবং তারপর আমরা মক অবজেক্ট ব্যবহার করে পরীক্ষাটি চালাই।
- Verification:
EasyMock.verify(mockCalculator)মেথডটি নিশ্চিত করে যে সমস্ত নির্ধারিত মেথড কল হয়েছে এবং সেগুলি সঠিকভাবে কার্যকর হয়েছে।verify()নিশ্চিত করবে যেadd()এবংsubtract()মেথড দুটি এক্সিকিউট হয়েছে, এবং প্রতিটি মেথড একবারই কল হয়েছে।
4. Verification Options
EasyMock.verify() মেথডের মাধ্যমে বিভিন্ন ধরনের ভেরিফিকেশন করা যায়:
- Method Call Count: মেথডটি কতবার কল হয়েছে তা যাচাই করা।
- once(): মেথডটি একবার কল হবে।
- times(n): মেথডটি
nবার কল হবে। - atLeastOnce(): মেথডটি কমপক্ষে একবার কল হবে।
- atMostOnce(): মেথডটি একবারের বেশি কল হবে না।
উদাহরণ: Method Call Count Verification
// Define behavior
EasyMock.expect(mockCalculator.add(2, 3)).andReturn(5);
// Define expected call count
EasyMock.expect(mockCalculator.subtract(5, 3)).andReturn(2);
// Activate the mock
EasyMock.replay(mockCalculator);
// Call the methods
mockCalculator.add(2, 3);
mockCalculator.subtract(5, 3);
mockCalculator.subtract(5, 3); // Calling twice
// Verify call counts
EasyMock.verify(mockCalculator); // Will verify that 'subtract' was called exactly twice
এখানে subtract(5, 3) মেথডটি দুইবার কল করা হয়েছে, এবং verify মেথডটি নিশ্চিত করবে যে এটি সঠিকভাবে দুইবার কল হয়েছে।
5. Exception Verification
এছাড়াও, মক অবজেক্টে এক্সেপশন ছুঁড়ে দেওয়ার ক্ষেত্রেও ভেরিফিকেশন করা যায়।
উদাহরণ: Throwing an Exception and Verifying
// Define behavior to throw an exception
EasyMock.expect(mockCalculator.add(2, -1)).andThrow(new IllegalArgumentException("Invalid input"));
// Activate the mock
EasyMock.replay(mockCalculator);
// Call the method (which will throw an exception)
try {
mockCalculator.add(2, -1);
} catch (IllegalArgumentException e) {
System.out.println("Caught Exception: " + e.getMessage());
}
// Verify the exception throwing
EasyMock.verify(mockCalculator);
এখানে, add(2, -1) মেথডে IllegalArgumentException ছুঁড়ে দেয়া হয়েছে এবং verify() নিশ্চিত করে যে এই এক্সেপশনটি সঠিকভাবে ফেলে দেওয়া হয়েছে।
6. সারাংশ
Mock Object Verification হল EasyMock এর একটি গুরুত্বপূর্ণ ফিচার যা নিশ্চিত করে যে মক অবজেক্ট সঠিকভাবে ব্যবহার হয়েছে। EasyMock.verify() মেথডের মাধ্যমে আপনি মক অবজেক্টের মেথড কলের সঠিকতা যাচাই করতে পারেন, যেমন:
- কতবার মেথড কল হয়েছে।
- মেথডটি সঠিক আর্গুমেন্টের সাথে কল হয়েছে কিনা।
- কোন এক্সেপশন সঠিকভাবে ছোঁড়া হয়েছে কিনা।
এটি ইউনিট টেস্টিংয়ের গুরুত্বপূর্ণ অংশ, যা কোডের সঠিকতা নিশ্চিত করতে সহায়ক।
Verification হল EasyMock-এ একটি গুরুত্বপূর্ণ কনসেপ্ট যা নিশ্চিত করে যে, মক অবজেক্টের ওপর নির্দিষ্ট মেথডগুলি ঠিকভাবে এবং সঠিক আর্গুমেন্ট সহ কল হয়েছে কিনা। এটি টেস্টিংয়ের পরে চালানো হয় এবং নিশ্চিত করে যে সমস্ত প্রত্যাশিত আচরণ সঠিকভাবে বাস্তবায়িত হয়েছে।
Verification এর মাধ্যমে আপনি মক অবজেক্টের interactions পরীক্ষা করতে পারেন এবং নিশ্চিত হতে পারেন যে, মক অবজেক্টের নির্ধারিত আচরণগুলি টেস্টের সময় ঠিকভাবে ঘটেছে।
1. Verification কনসেপ্ট
Verification মূলত পরীক্ষায় ব্যবহৃত মক অবজেক্টের মেথড কলগুলির সঠিকতা পরীক্ষা করার জন্য ব্যবহৃত হয়। মক অবজেক্টের মেথডকে সঠিকভাবে কল করা হয়েছে কিনা তা যাচাই করতে verify() মেথড ব্যবহার করা হয়।
Verification এর উদ্দেশ্য:
- Ensure Expected Interactions: মক অবজেক্টের যে মেথডগুলির কল আশা করা হচ্ছিল, সেগুলি ঠিকভাবে কল হয়েছে কিনা তা নিশ্চিত করা।
- Detect Missing or Unexpected Interactions: যদি মক অবজেক্টের কোনো মেথড কল না হয়, কিংবা অপ্রত্যাশিতভাবে অন্য মেথড কল হয়, তাহলে তা শনাক্ত করা।
- Test Integrity: টেস্টের মধ্যে ব্যবহৃত মক অবজেক্টের আচরণ নিশ্চিত করা।
2. EasyMock এ Verification প্রক্রিয়া
EasyMock এ Verification করার জন্য মূলত verify() মেথড ব্যবহার করা হয়। এটি নিশ্চিত করে যে, মক অবজেক্টের প্রতি সমস্ত প্রত্যাশিত মেথড কল সঠিকভাবে হয়েছে এবং কোনো অপ্রত্যাশিত কল হয়নি।
Verification এর প্রধান ধাপ:
- Setup Expectations: মক অবজেক্টের জন্য প্রত্যাশিত আচরণ নির্ধারণ করা হয় (
expect()ব্যবহার করে)। - Invoke Methods: টেস্ট কোডের মাধ্যমে মক অবজেক্টের মেথড কল করা হয়।
- Verification:
verify()মেথড কল করা হয়, যা নিশ্চিত করে যে, প্রত্যাশিত মেথডগুলি সঠিকভাবে কল হয়েছে।
3. EasyMock Verification উদাহরণ
ধরা যাক, একটি PaymentService ইন্টারফেস এবং একটি TransactionProcessor ক্লাস রয়েছে, যেখানে TransactionProcessor PaymentService এর উপর নির্ভরশীল। আমরা পরীক্ষা করতে চাই যে processPayment() মেথডটি সঠিকভাবে কল হয়েছে কিনা।
Example: PaymentService এবং Verification
import org.easymock.EasyMock;
import org.junit.Test;
import static org.easymock.EasyMock.*;
public class EasyMockVerificationExample {
// Sample interface to be mocked
public interface PaymentService {
void processPayment(String accountId, double amount);
}
// Class that depends on PaymentService
public class TransactionProcessor {
private PaymentService paymentService;
public TransactionProcessor(PaymentService paymentService) {
this.paymentService = paymentService;
}
public void processTransaction(String accountId, double amount) {
paymentService.processPayment(accountId, amount);
}
}
@Test
public void testTransactionProcessing() {
// Create a mock object for PaymentService
PaymentService mockPaymentService = EasyMock.createMock(PaymentService.class);
// Setup the expectation for mock object
mockPaymentService.processPayment("12345", 1500.0);
expectLastCall().once(); // Expect that processPayment is called once with these arguments
// Activate the mock
replay(mockPaymentService);
// Create the object that depends on PaymentService
TransactionProcessor transactionProcessor = new TransactionProcessor(mockPaymentService);
// Call the method that will invoke the mocked method
transactionProcessor.processTransaction("12345", 1500.0);
// Verify the interactions with the mock
verify(mockPaymentService);
}
}
ব্যাখ্যা:
- Setup Expectations:
expect(mockPaymentService.processPayment("12345", 1500.0))এর মাধ্যমে আমরা প্রত্যাশা করছি যে,processPaymentমেথডটি এই আর্গুমেন্ট সহ একবার কল হবে। - Invoke Methods:
transactionProcessor.processTransaction()কল করার মাধ্যমে মক অবজেক্টের মেথডটি কল করা হয়েছে। - Verification:
verify(mockPaymentService)এর মাধ্যমে আমরা নিশ্চিত হয়েছি যে,processPayment()মেথডটি একবার সঠিক আর্গুমেন্ট সহ কল হয়েছে।
4. Verification এর অন্যান্য বৈশিষ্ট্য
EasyMock এর verify() মেথডের কিছু গুরুত্বপূর্ণ বৈশিষ্ট্য আছে:
1. Verification on Multiple Calls:
যদি কোনো মেথড একাধিকবার কল করা হয়, তবে আপনি এটি যাচাই করতে পারেন।
Example:
mockPaymentService.processPayment("12345", 1500.0);
mockPaymentService.processPayment("67890", 2000.0);
expectLastCall().times(2); // Expecting two calls with these arguments
replay(mockPaymentService);
transactionProcessor.processTransaction("12345", 1500.0);
transactionProcessor.processTransaction("67890", 2000.0);
verify(mockPaymentService); // Will pass as both calls are made
2. Verifying the Call Order:
EasyMock এর মাধ্যমে আপনি কলের অর্ডারও যাচাই করতে পারেন, অর্থাৎ নির্দিষ্ট অর্ডারে মেথড কল করা হয়েছে কিনা।
Example:
// Define expectations for call order
mockPaymentService.processPayment("12345", 1500.0);
expectLastCall().before(mockPaymentService.processPayment("67890", 2000.0));
replay(mockPaymentService);
transactionProcessor.processTransaction("12345", 1500.0);
transactionProcessor.processTransaction("67890", 2000.0);
verify(mockPaymentService); // Verifies the order of calls
3. Verifying the Number of Calls:
আপনি যাচাই করতে পারেন যে একটি মেথড কতবার কল হয়েছে।
Example:
mockPaymentService.processPayment("12345", 1500.0);
expectLastCall().times(1); // Expect that processPayment is called once
replay(mockPaymentService);
transactionProcessor.processTransaction("12345", 1500.0);
verify(mockPaymentService); // Will pass as the method is called once
5. Advantages of Verification in EasyMock
- Test Accuracy: Verification ensures that your mock objects are behaving as expected, and that methods are being called with the correct arguments and in the correct order.
- Detects Missing or Extra Calls: It helps identify if any expected method calls were missed or if unexpected method calls were made.
- Ensures Code Integrity: By verifying interactions, you ensure that your unit test is validating the right behavior and interactions between components.
Verification in EasyMock is a critical step in unit testing with mock objects. It ensures that the expected interactions with mock objects have occurred as planned. By using the verify() method, you can validate that your mock objects have been used correctly, whether it's checking the number of calls, the arguments passed, or the order of method calls. This helps ensure the correctness of your tests and improves the quality of your software.
EasyMock-এ Method Calls এর Verification কী?
Method Calls Verification হল একটি প্রক্রিয়া যার মাধ্যমে নিশ্চিত করা হয় যে একটি মক অবজেক্টের মেথডগুলি সঠিকভাবে কল করা হয়েছে কিনা এবং পূর্বনির্ধারিত প্রত্যাশা অনুযায়ী সেগুলির আচরণ ঠিক ছিল। EasyMock-এ verify() মেথড ব্যবহৃত হয় মক অবজেক্টের মেথড কলগুলো যাচাই করতে, এবং এটি নিশ্চিত করতে সাহায্য করে যে প্রত্যাশিত মেথড কল সঠিকভাবে এবং নির্দিষ্ট সংখ্যায় হয়েছে।
কেন Method Calls Verification প্রয়োজন?
- Correctness: মক অবজেক্টের মেথড কলগুলো সঠিকভাবে হয়েছে কিনা তা নিশ্চিত করা।
- Behavior Verification: মক অবজেক্টের প্রত্যাশিত আচরণ (expectations) সঠিকভাবে কার্যকরী হয়েছে কিনা তা যাচাই করা।
- Test Coverage: মেথড কলগুলো পরীক্ষা করে নিশ্চিত করা যে কোডের সমস্ত প্রয়োজনীয় অংশ সঠিকভাবে পরীক্ষা করা হয়েছে।
EasyMock-এ Method Calls Verification কীভাবে করবেন?
Step 1: Expectation Setting
প্রথমে, আপনাকে expect() মেথড ব্যবহার করে মক অবজেক্টের প্রত্যাশা সেট করতে হবে। এর মাধ্যমে আপনি কোন মেথড কল হবে এবং তার প্রত্যাশিত ফলাফল কী হবে, তা নির্ধারণ করতে পারেন।
Step 2: Replay Mode
replay() মেথড ব্যবহারের মাধ্যমে আপনি মক অবজেক্টে পূর্বনির্ধারিত প্রত্যাশাগুলি সক্রিয় করবেন। এর পর মক অবজেক্টটি টেস্টিংয়ের জন্য প্রস্তুত হবে।
Step 3: Verification
verify() মেথড ব্যবহার করে, আপনি যাচাই করতে পারেন যে প্রত্যাশিত মেথডগুলো সঠিকভাবে কল করা হয়েছে কিনা।
EasyMock Example: Method Calls Verification
ধরা যাক, একটি Service ইন্টারফেসের greet() এবং farewell() মেথড রয়েছে এবং আমরা যাচাই করতে চাই যে এই মেথডগুলো সঠিকভাবে কল হয়েছে কিনা।
Step 1: Service Interface
public interface Service {
String greet(String name);
String farewell(String name);
}
Step 2: Test Class
import org.easymock.EasyMock;
import org.junit.Test;
import static org.junit.Assert.*;
public class EasyMockVerificationTest {
@Test
public void testMethodCallsVerification() {
// Create a mock of the Service interface
Service serviceMock = EasyMock.createMock(Service.class);
// Setting up expectations
EasyMock.expect(serviceMock.greet("John")).andReturn("Hello, John!");
EasyMock.expect(serviceMock.farewell("John")).andReturn("Goodbye, John!");
// Activate the mock
EasyMock.replay(serviceMock);
// Test the mock behavior
String greetResult = serviceMock.greet("John");
String farewellResult = serviceMock.farewell("John");
// Verifying the results
assertEquals("Hello, John!", greetResult);
assertEquals("Goodbye, John!", farewellResult);
// Verify that the methods were called as expected
EasyMock.verify(serviceMock); // This verifies that the mock methods were called
}
}
ব্যাখ্যা:
- EasyMock.createMock(Service.class): এটি
Serviceইন্টারফেসের একটি মক অবজেক্ট তৈরি করেছে। - EasyMock.expect(): এটি মক অবজেক্টের জন্য প্রত্যাশা সেট করেছে, যেখানে
greet("John")এবংfarewell("John")মেথডের প্রত্যাশিত ফলাফল নির্ধারণ করা হয়েছে। - EasyMock.replay(): এটি মক অবজেক্টে প্রত্যাশা সক্রিয় করেছে, যার পর মক অবজেক্টটি টেস্ট করার জন্য প্রস্তুত হয়েছে।
- EasyMock.verify(): এটি যাচাই করেছে যে প্রত্যাশিত মেথড কলগুলি সঠিকভাবে মক অবজেক্টে হয়েছে কিনা।
Verification Failure Example
ধরা যাক, আপনি greet() মেথডটি কল করেছেন, তবে farewell() মেথডটি কল করেননি। verify() মেথডটি তখন ত্রুটি দেখাবে।
@Test
public void testMethodCallsVerificationFailure() {
// Create a mock of the Service interface
Service serviceMock = EasyMock.createMock(Service.class);
// Setting up expectations
EasyMock.expect(serviceMock.greet("John")).andReturn("Hello, John!");
// Activate the mock
EasyMock.replay(serviceMock);
// Test the mock behavior (only greet() method is called)
String greetResult = serviceMock.greet("John");
// Verifying the result
assertEquals("Hello, John!", greetResult);
// Verify that the methods were called as expected
EasyMock.verify(serviceMock); // This will fail since farewell() was not called
}
এই ক্ষেত্রে, verify() মেথডটি UnexpectedMethodCallException ত্রুটি তৈরি করবে, কারণ farewell() মেথডটি প্রত্যাশিত হলেও কল করা হয়নি।
Verification Methods:
- EasyMock.verify():
- এটি যাচাই করে যে সকল প্রত্যাশিত মেথড কল সঠিকভাবে মক অবজেক্টে হয়েছে কিনা।
- যদি কোনো মেথড কল প্রত্যাশিত না হয় বা নির্ধারিত হয়, তবে এটি ত্রুটি দেখাবে।
- EasyMock.verify(Service.class):
- verify() মেথড শুধুমাত্র মক অবজেক্টের জন্য কল করা উচিত এবং এটি নিশ্চিত করে যে প্রত্যাশিত মেথড কল সঠিকভাবে হয়েছে।
- EasyMock.times():
- আপনি মক অবজেক্টের মেথড কলের সংখ্যাও নির্ধারণ করতে পারেন, যেমন
andReturn()এর পরEasyMock.times(2)ব্যবহার করে মেথডটি ২ বার কল হওয়া প্রত্যাশা করতে পারেন।
- আপনি মক অবজেক্টের মেথড কলের সংখ্যাও নির্ধারণ করতে পারেন, যেমন
সারাংশ
EasyMock.verify() মেথডটি একটি অত্যন্ত গুরুত্বপূর্ণ টেস্টিং টুল যা নিশ্চিত করে যে মক অবজেক্টের মেথডগুলো সঠিকভাবে এবং নির্দিষ্ট সংখ্যায় কল হয়েছে কিনা। এটি unit tests-এ method calls verification করতে ব্যবহৃত হয়। verify() মেথডের সাহায্যে আপনি নিশ্চিত করতে পারবেন যে মক অবজেক্টের আচরণ সঠিকভাবে কাজ করছে এবং এটি আপনার expectations অনুযায়ী ব্যবহার করা হয়েছে।
EasyMock একটি জনপ্রিয় mocking framework যা unit testing তে ব্যবহৃত হয়। এটি টেস্টিংয়ের সময় মক অবজেক্টের আচরণ নির্ধারণ করতে এবং সেই আচরণের উপর ভিত্তি করে verification করতে সাহায্য করে। Exact এবং Range-Based Verification হল সেই ধরনের বৈশিষ্ট্য, যার মাধ্যমে আপনি নিশ্চিত করতে পারেন যে একটি নির্দিষ্ট মেথড কতবার এবং কখন কল হয়েছে।
EasyMock এ verification করার জন্য তিনটি সাধারণ মেথড ব্যবহৃত হয়:
times()atLeast()atMost()
এই মেথডগুলি method call এর সংখ্যা যাচাই করার জন্য ব্যবহার করা হয়, যা আপনার টেস্টের উদ্দেশ্য অনুযায়ী উপযুক্ত হতে পারে।
1. Exact Verification (times())
Exact Verification এর মাধ্যমে আপনি যাচাই করতে পারেন যে একটি নির্দিষ্ট মেথড কতবার কল করা হয়েছে। times() মেথডটি এই যাচাইয়ের জন্য ব্যবহার করা হয়। এটি নিশ্চিত করে যে মক অবজেক্টের নির্দিষ্ট মেথডটি নির্দিষ্ট সংখ্যক বার কল হয়েছে।
1.1. Exact Verification Example (times())
import org.easymock.EasyMock;
import org.junit.Test;
import static org.junit.Assert.*;
class PaymentService {
public void processPayment(int amount) {
System.out.println("Payment of " + amount + " processed.");
}
}
public class ExactVerificationExample {
@Test
public void testExactVerification() {
// Create mock object
PaymentService paymentServiceMock = EasyMock.createMock(PaymentService.class);
// Define the expected behavior
paymentServiceMock.processPayment(100);
EasyMock.expectLastCall().times(2); // Expect processPayment to be called exactly twice
// Activate the mock
EasyMock.replay(paymentServiceMock);
// Use the mock
paymentServiceMock.processPayment(100);
paymentServiceMock.processPayment(100);
// Verify that the mock method was called exactly twice
EasyMock.verify(paymentServiceMock);
}
}
ব্যাখ্যা:
expectLastCall().times(2): এখানেprocessPayment(100)মেথডটি দ্বিবার কল হওয়ার জন্য নির্ধারণ করা হয়েছে। যদি এটি একবার বা তিনবার কল হয়, তবে টেস্টটি ব্যর্থ হবে।verify(paymentServiceMock): এটি যাচাই করে যে মক অবজেক্টের processPayment() মেথডটি নির্ধারিত সংখ্যক বার কল হয়েছে।
আউটপুট:
Payment of 100 processed.
Payment of 100 processed.
2. Range-Based Verification
Range-Based Verification এর মাধ্যমে আপনি নিশ্চিত করতে পারেন যে একটি নির্দিষ্ট মেথড কতবার কল হয়েছে, এবং একটি নির্দিষ্ট পরিসীমা (range) এর মধ্যে এটি হওয়া উচিত। এতে তিনটি মেথড ব্যবহৃত হয়:
atLeast(): মেথডটি কমপক্ষে একটি নির্দিষ্ট সংখ্যক বার কল হওয়া উচিত।atMost(): মেথডটি সর্বাধিক একটি নির্দিষ্ট সংখ্যক বার কল হওয়া উচিত।times(): নির্দিষ্ট সংখ্যক বার কল হওয়া উচিত (যেমন পূর্বের উদাহরণে)।
2.1. atLeast() Example
import org.easymock.EasyMock;
import org.junit.Test;
import static org.junit.Assert.*;
public class AtLeastVerificationExample {
@Test
public void testAtLeastVerification() {
// Create mock object
PaymentService paymentServiceMock = EasyMock.createMock(PaymentService.class);
// Define the expected behavior
paymentServiceMock.processPayment(100);
EasyMock.expectLastCall().atLeastOnce(); // Expect processPayment to be called at least once
// Activate the mock
EasyMock.replay(paymentServiceMock);
// Use the mock
paymentServiceMock.processPayment(100);
paymentServiceMock.processPayment(100); // Call it multiple times
// Verify that the mock method was called at least once
EasyMock.verify(paymentServiceMock);
}
}
ব্যাখ্যা:
expectLastCall().atLeastOnce(): এটি নিশ্চিত করে যেprocessPayment(100)মেথডটি অন্তত একবার কল হয়েছে, তবে এটি আরো বেশি বারও হতে পারে।
আউটপুট:
Payment of 100 processed.
Payment of 100 processed.
2.2. atMost() Example
import org.easymock.EasyMock;
import org.junit.Test;
import static org.junit.Assert.*;
public class AtMostVerificationExample {
@Test
public void testAtMostVerification() {
// Create mock object
PaymentService paymentServiceMock = EasyMock.createMock(PaymentService.class);
// Define the expected behavior
paymentServiceMock.processPayment(100);
EasyMock.expectLastCall().atMost(3); // Expect processPayment to be called at most 3 times
// Activate the mock
EasyMock.replay(paymentServiceMock);
// Use the mock
paymentServiceMock.processPayment(100);
paymentServiceMock.processPayment(100);
paymentServiceMock.processPayment(100); // Call it three times
// Verify that the mock method was called at most 3 times
EasyMock.verify(paymentServiceMock);
}
}
ব্যাখ্যা:
expectLastCall().atMost(3): এটি নিশ্চিত করে যেprocessPayment(100)মেথডটি সর্বোচ্চ ৩ বার কল হয়েছে, কিন্তু তার বেশি নয়। যদি এটি ৪ বার কল হয়, তবে টেস্টটি ব্যর্থ হবে।
আউটপুট:
Payment of 100 processed.
Payment of 100 processed.
Payment of 100 processed.
3. Combined Example (times(), atLeast(), atMost())
এখন আমরা times(), atLeast(), এবং atMost() একসঙ্গে ব্যবহার করে একটি উদাহরণ দেখব:
import org.easymock.EasyMock;
import org.junit.Test;
import static org.junit.Assert.*;
public class CombinedVerificationExample {
@Test
public void testCombinedVerification() {
// Create mock object
PaymentService paymentServiceMock = EasyMock.createMock(PaymentService.class);
// Define the expected behavior
paymentServiceMock.processPayment(100);
EasyMock.expectLastCall().times(2); // Expect processPayment to be called exactly twice
paymentServiceMock.processPayment(200);
EasyMock.expectLastCall().atLeastOnce(); // Expect processPayment to be called at least once with amount 200
paymentServiceMock.processPayment(300);
EasyMock.expectLastCall().atMost(3); // Expect processPayment to be called at most 3 times with amount 300
// Activate the mock
EasyMock.replay(paymentServiceMock);
// Using the mock
paymentServiceMock.processPayment(100);
paymentServiceMock.processPayment(100);
paymentServiceMock.processPayment(200);
paymentServiceMock.processPayment(300);
paymentServiceMock.processPayment(300);
// Verify that the mock methods were called the expected number of times
EasyMock.verify(paymentServiceMock);
}
}
ব্যাখ্যা:
times(2): এটি নিশ্চিত করে যেprocessPayment(100)মেথডটি ঠিক দুইবার কল হয়েছে।atLeastOnce(): এটি নিশ্চিত করে যেprocessPayment(200)কমপক্ষে একবার কল হয়েছে।atMost(3): এটি নিশ্চিত করে যেprocessPayment(300)সর্বোচ্চ তিনবার কল হয়েছে।
আউটপুট:
Payment of 100 processed.
Payment of 100 processed.
Payment of 200 processed.
Payment of 300 processed.
Payment of 300 processed.
EasyMock এর Exact এবং Range-Based Verification (times(), atLeast(), atMost()) এর মাধ্যমে আপনি মক অবজেক্টের আচরণ এবং মেথড কলের সংখ্যা যাচাই করতে পারেন। এটি নিশ্চিত করতে সহায়ক যে, একটি নির্দিষ্ট মেথড কতবার কল হয়েছে এবং তা আপনার টেস্টের উদ্দেশ্যের সাথে মেলে কিনা।
- times(): নির্দিষ্ট সংখ্যক বার কল হওয়া উচিত।
- atLeast(): কমপক্ষে একটি নির্দিষ্ট সংখ্যক বার কল হওয়া উচিত।
- atMost(): সর্বোচ্চ একটি নির্দিষ্ট সংখ্যক বার কল হওয়া উচিত।
এই বৈশিষ্ট্যগুলি ব্যবহার করে আপনি মক অবজেক্টের আচরণ আরও নির্ভুলভাবে যাচাই করতে পারবেন, যা unit testing এর একটি গুরুত্বপূর্ণ অংশ।
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