Тестирование простого многопоточного кода с использованием EasyMock, но получил странный результат
Я тестирую простой многопоточный код, используя EasyMock
:
исходный код:
public class EasyMockTest {
ExecutorService executorService;
TestObject testObject;
public EasyMockTest(ExecutorService executorService, TestObject testObject)
{
this.executorService = executorService;
this.testObject = testObject;
}
public void test()
{
try
{
executorService.submit(() ->{
testObject.doSomething();
});
}
catch(RejectedExecutionException ex)
{
}
}
}
public class TestObject {
public void doSomething()
{
}
}
Тестовый код с EasyMock:
public class EasyMockTest_test {
private TestObject testObject;
private ExecutorService executorService;
private EasyMockTest easyMockTest;
@Before
public void setUp()
{
executorService = new ThreadPoolExecutor(1, 1, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(1));
testObject = EasyMock.createMock(TestObject.class);
easyMockTest = new EasyMockTest(executorService, testObject);
}
@Test
public void test_easyMockTest()
{
testObject.doSomething();
EasyMock.expectLastCall().andAnswer(new IAnswer<Void>(){
@Override
public Void answer() throws Throwable {
Thread.sleep(100);
return null;
}}).times(2);
EasyMock.replay(testObject);
easyMockTest.test();
easyMockTest.test();
easyMockTest.test();
EasyMock.verify(testObject);
}
}
Я думаю в этом случае testObject.doSomething()
следует вызывать только дважды. Поскольку в пуле потоков есть один поток, а размер очереди один, я оставляю первые два потока в спящем режиме. Поэтому, когда я отправляю три задания, третье должно быть отклонено, а первые два должны быть вызваны. Но когда я запускаю этот код, возникает ошибка:
java.lang.AssertionError:
Ошибка ожидания при подтверждении: TestObject.doSomething(): ожидаемый: 2, фактический: 1 в org.easymock.internal.MocksControl.verify(MocksControl.java:225) в org.easymock.EasyMock.verify(EasyMock.java:2007) ...
Это означает, что метод вызывается только один раз, что я не могу понять.
Я тоже пробовал комментировать Thread.sleep(100)
; на этот раз фактическое время вызова становится 2, но я думаю, что это должно быть 3, так как ни один поток не спит.
Затем я попытался переместить позицию.times() следующим образом:
EasyMock.expectLastCall().times(2).andAnswer(new IAnswer<Void>(){
@Override
public Void answer() throws Throwable {
Thread.sleep(100);
return null;
}});
На этот раз ошибка становится:
java.lang.AssertionError: Ошибка ожидания при проверке: TestObject.doSomething(): ожидается: 3, фактически: 2
Почему результат ожидает 3, когда я даю 2?
Извините, я не эксперт по EasyMock
, действительно ценю, если кто-то может помочь.
1 ответ
Ничто не гарантирует, что ваши задачи будут выполнены до verify
достигнуто Вам нужно что-то, чтобы ускорить выполнение.
Это работает:
@Test public void test_easyMockTest () создает InterruptedException {CountDownLatch latch = new CountDownLatch (3);
testObject.doSomething();
EasyMock.expectLastCall().andAnswer(new IAnswer<Void>(){
@Override
public Void answer() throws Throwable {
latch.countDown();
return null;
}}).times(2);
EasyMock.replay(testObject);
easyMockTest.test();
easyMockTest.test();
easyMockTest.test();
latch.await(1, TimeUnit.SECONDS);
EasyMock.verify(testObject);
}
Здесь я предполагаю, что вы действительно хотите RejectedExecutionException
быть пойманным и проигнорированным.