One may easily stub a method in the Mockito mocking framework which would return different objects at different calls. This enables modelling different reactions to every one of the calls to a stubbed method. Chaining few thenReturn() calls and then return() along with a multiple-argument call to achieve the same are available options.
The following example demonstrates how to configure a mocked method to return different objects in subsequent calls:
import static org.mockito.Mockito.*;
import java.util.concurrent.*;
public class TestExample {
public static void main(String[] args) throws Exception {
// Create a mock of Future<T>
Future<String> future1 = mock(Future.class);
Future<String> future2 = mock(Future.class);
// Stub the 'get()' method of the futures to return different values
when(future1.get()).thenReturn("Result 1");
when(future2.get()).thenReturn("Result 2");
// Create a mock ExecutorCompletionService
ExecutorCompletionService<String> completionService = mock(ExecutorCompletionService.class);
// Stub the 'take()' method to return different Future objects on subsequent calls
when(completionService.take()).thenReturn(future1).thenReturn(future2);
// Invoke the method you want to test and verify behavior
String result1 = completionService.take().get();
String result2 = completionService.take().get();
System.out.println(result1); // Outputs: Result 1
System.out.println(result2); // Outputs: Result 2
}
}