EasyMock সাধারণত synchronous মেথড মক করার জন্য ব্যবহৃত হয়, যেখানে মেথডটি কল হওয়ার সাথে সাথে ফলাফল রিটার্ন করে। তবে, asynchronous methods মক করা একটু চ্যালেঞ্জিং হতে পারে, কারণ এদের আচরণ সিঙ্ক্রোনাস নয় এবং ফলাফল অনেক সময় পর পাওয়া যেতে পারে।
এখানে, EasyMock এর মাধ্যমে asynchronous methods মক করার কৌশল নিয়ে আলোচনা করা হবে।
1. Asynchronous Method Mocking
Asynchronous methods হল সেই মেথড যেগুলি তৎক্ষণাৎ ফলাফল প্রদান না করে, বরং কোন প্রক্রিয়া বা থ্রেডের মাধ্যমে ফলাফল ফেরত দেয়। যেমন, একটি Future বা CompletableFuture অবজেক্ট ব্যবহার করে সিঙ্ক্রোনাস না হয়ে আসিনক্রোনাস ফলাফল পাওয়া যায়।
EasyMock এ, আপনি asynchronous method এর জন্য thenAnswer() বা andReturn() ব্যবহার করতে পারেন যাতে মক অবজেক্টটি আসিনক্রোনাস ফলাফল প্রদান করে। এতে, আপনি মক অবজেক্টের মাধ্যমে asynchronous behavior সিমুলেট করতে পারেন।
2. Example of Asynchronous Method Mocking
ধরা যাক, আমাদের একটি AsynchronousService ক্লাস রয়েছে যা Future ব্যবহার করে একটি অ্যাসিনক্রোনাস রেসপন্স প্রদান করে। আমরা এই রেসপন্সটি EasyMock ব্যবহার করে মক করব।
2.1. Asynchronous Method Example Using Future
import org.easymock.EasyMock;
import org.junit.Test;
import static org.junit.Assert.*;
import java.util.concurrent.CompletableFuture;
interface AsynchronousService {
CompletableFuture<String> fetchDataAsync();
}
public class AsynchronousMethodMockingExample {
@Test
public void testAsynchronousMethodMocking() {
// 1. Create mock object for AsynchronousService
AsynchronousService asyncServiceMock = EasyMock.createMock(AsynchronousService.class);
// 2. Set up the mock behavior for asynchronous method
CompletableFuture<String> futureMock = CompletableFuture.completedFuture("Mocked data");
EasyMock.expect(asyncServiceMock.fetchDataAsync()).andReturn(futureMock);
// 3. Activate replay mode
EasyMock.replay(asyncServiceMock);
// 4. Call the asynchronous method
CompletableFuture<String> resultFuture = asyncServiceMock.fetchDataAsync();
// 5. Verify the result of the asynchronous call
resultFuture.thenAccept(result -> {
assertEquals("Mocked data", result);
});
// 6. Verify the mock interactions
EasyMock.verify(asyncServiceMock);
}
}
ব্যাখ্যা:
- AsynchronousService ইন্টারফেসে একটি
fetchDataAsync()মেথড রয়েছে, যাCompletableFuture<String>রিটার্ন করে, অর্থাৎ একটি অ্যাসিনক্রোনাস রেসপন্স প্রদান করে। - EasyMock.createMock(AsynchronousService.class) ব্যবহার করে আমরা মক অবজেক্ট তৈরি করেছি।
- EasyMock.expect() এবং andReturn() মেথড ব্যবহার করে আমরা মক অবজেক্টের
fetchDataAsync()মেথডের জন্য একটি মকCompletableFutureসেট করেছি, যা "Mocked data" রিটার্ন করবে। replay()মেথডে মক অবজেক্টের expectation সক্রিয় করেছি।- মক অবজেক্টের
fetchDataAsync()কল করার পর, আমরাCompletableFutureএরthenAccept()মেথড ব্যবহার করে "Mocked data" ভ্যালু যাচাই করেছি।
আউটপুট:
Test passed successfully.
3. Using thenAnswer() for Asynchronous Behavior
কখনো কখনো, আপনি asynchronous methods মক করার সময় আরও জটিল আচরণ চান। যেমন, আপনি যদি মক অবজেক্টে different async responses প্রদান করতে চান বা exception থ্রো করতে চান, তাহলে thenAnswer() ব্যবহার করা যেতে পারে। এটি আপনাকে একটি Answer অবজেক্ট প্রদান করতে দেয় যা মক মেথডের কলের জন্য কাস্টম আচরণ প্রদান করবে।
3.1. Using thenAnswer() for Asynchronous Method Mocking
import org.easymock.EasyMock;
import org.junit.Test;
import static org.junit.Assert.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
interface AsynchronousService {
CompletableFuture<String> fetchDataAsync(int id);
}
public class AsynchronousMethodMockingWithAnswer {
@Test
public void testAsynchronousMethodWithAnswer() throws ExecutionException, InterruptedException {
// 1. Create mock object for AsynchronousService
AsynchronousService asyncServiceMock = EasyMock.createMock(AsynchronousService.class);
// 2. Use thenAnswer() to mock asynchronous behavior
EasyMock.expect(asyncServiceMock.fetchDataAsync(EasyMock.anyInt()))
.andAnswer(() -> {
// Simulate a delay and return a CompletableFuture with a value
CompletableFuture<String> future = new CompletableFuture<>();
future.complete("Mocked data for id " + 1); // simulate async result
return future;
});
// 3. Activate replay mode
EasyMock.replay(asyncServiceMock);
// 4. Call the asynchronous method
CompletableFuture<String> resultFuture = asyncServiceMock.fetchDataAsync(1);
// 5. Verify the result of the asynchronous call
String result = resultFuture.get();
assertEquals("Mocked data for id 1", result);
// 6. Verify the mock interactions
EasyMock.verify(asyncServiceMock);
}
}
ব্যাখ্যা:
- এখানে, আমরা
fetchDataAsync(int id)মেথডের জন্যthenAnswer()ব্যবহার করেছি, যেখানে একটিCompletableFutureরিটার্ন করা হচ্ছে। andAnswer()মেথডের মাধ্যমে আমরাCompletableFutureঅবজেক্ট তৈরি করছি এবং এটি "Mocked data for id 1" ভ্যালু পূর্ণ করছি।replay()এবংverify()মেথড ব্যবহার করে আমরা নিশ্চিত করেছি যে মক অবজেক্ট সঠিকভাবে আচরণ করছে।
আউটপুট:
Test passed successfully.
4. Asynchronous Exception Handling with EasyMock
এছাড়া, যদি আপনি asynchronous method থেকে exception থ্রো করতে চান, তবে আপনি andThrow() ব্যবহার করতে পারেন। এটি একটি CompletableFuture এর মধ্যে exception ছুড়ে দিতে সাহায্য করবে।
4.1. Asynchronous Exception Example
import org.easymock.EasyMock;
import org.junit.Test;
import static org.junit.Assert.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
interface AsynchronousService {
CompletableFuture<String> fetchDataAsync(int id);
}
public class AsynchronousExceptionExample {
@Test(expected = RuntimeException.class)
public void testAsynchronousException() throws ExecutionException, InterruptedException {
// 1. Create mock object for AsynchronousService
AsynchronousService asyncServiceMock = EasyMock.createMock(AsynchronousService.class);
// 2. Use andThrow() to throw an exception for asynchronous method
EasyMock.expect(asyncServiceMock.fetchDataAsync(EasyMock.anyInt()))
.andThrow(new RuntimeException("Async exception"));
// 3. Activate replay mode
EasyMock.replay(asyncServiceMock);
// 4. Call the asynchronous method and expect exception
CompletableFuture<String> resultFuture = asyncServiceMock.fetchDataAsync(1);
// 5. Attempt to get the result, which should throw an exception
resultFuture.get(); // This will throw a RuntimeException
// 6. Verify the mock interactions
EasyMock.verify(asyncServiceMock);
}
}
ব্যাখ্যা:
- আমরা
fetchDataAsync()মেথডের জন্যandThrow()ব্যবহার করে RuntimeException মক করেছি। - যখন
resultFuture.get()কল করা হয়, এটি RuntimeException থ্রো করবে এবংexpectedআর্গুমেন্টে নির্দিষ্ট exception অ্যাসার্ট করা হয়েছে।
আউটপুট:
java.lang.RuntimeException: Async exception
EasyMock এ asynchronous methods মক করার জন্য আমরা CompletableFuture এবং thenAnswer() ব্যবহার করতে পারি। আপনি asynchronous behavior এর জন্য EasyMock এর মাধ্যমে mocking করতে পারেন এবং মক অবজেক্টের replay() এবং verify() মেথড ব্যবহার করে তাদের expectations যাচাই করতে পারেন। এছাড়া, আপনি andThrow() মেথড ব্যবহার করে asynchronous exception এর হ্যান্ডলিংও করতে পারেন।
thenAnswer(): ব্যবহারকারী কাস্টম আচরণ বাCompletableFutureরিটার্ন করতে পারেন।andThrow(): async exception থ্রো করার জন্য।
Read more