Тестирование простого многопоточного кода с использованием 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 быть пойманным и проигнорированным.

Другие вопросы по тегам