2016-03-01 7 views
0

я реализовал макет ExecutorService вернуть результат мгновенно, без необходимости создавать темы:Передразнивало ExecutorService всегда возвращает то же самое Передразнивало будущее

public static ExecutorService createMock() throws Exception { 
    ExecutorService executorServiceMock = EasyMock.createMock(ExecutorService.class); 
    Future future = EasyMock.createMock(Future.class); 
    Capture<Callable<?>> callableCapture = new Capture<>(); 
      EasyMock.expect(executorServiceMock.submit(EasyMock.<Callable<?>>capture(callableCapture))).andReturn(future).anyTimes(); 
    EasyMock.expect(future.get()).andAnswer(() -> callableCapture.getValue().call()).anyTimes(); 

    executorServiceMock.shutdown(); 
    EasyMock.expectLastCall().anyTimes(); 
    EasyMock.replay(future, executorServiceMock); 
    return executorServiceMock; 
} 

Проблема заключается в том, что она всегда возвращает один и тот же [высмеивал] Будущий объект. Мне нужно вернуть новый экземпляр Future mock на основе вызываемого объекта, переданного в executorServiceMock.submit() Я попытался использовать PowerMock.expectNew (Future.class), но он пожаловался «Нет конструктора, найденного в классе» java.util.concurrent .Future 'с типами параметров: [] "

ответ

0

Прежде всего "Don't mock type you don't own!". По ссылке вы можете найти несколько причин, почему вы не должны этого делать.

Но, если вы действительно хотите это сделать, то заменить обратный издеваться через ответ ведьме будет создавать новый Нок каждый раз:

EasyMock.expect(executorServiceMock.submit(EasyMock.<Callable<?>>capture(callableCapture))).andAnswer(() -> { 
    Future future = EasyMock.createMock(Future.class); 
    EasyMock.expect(future.get()).andAnswer(() -> callableCapture.getValue().call()).anyTimes(); 
    EasyMock.replay(future); 
    return future; 
}).anyTimes(); 

Кстати, вы не можете ожидать PowerMock.expectNew(Future.class), поскольку Future является интерфейс и не может быть создан.

0

Захват всегда будет возвращать последний захваченный объект. В вашем случае вы, похоже, хотите синхронизировать представление и получение.

Так что, я думаю, что вы должны сделать следующее:

ExecutorService executorServiceMock = createMock(ExecutorService.class); 

    expect(executorServiceMock.submit(EasyMock.<Callable<?>>anyObject())) 
     .andAnswer(() -> { 
      Future future = createMock(Future.class); 
      Object value = ((Callable<?>) getCurrentArguments()[0]).call(); 
      expect(future.get()).andReturn(value); 
      replay(future); 
      return future; 
     }) 
     .anyTimes(); 

    executorServiceMock.shutdown(); 
    expectLastCall().anyTimes(); 

    replay(executorServiceMock); 

    return executorServiceMock; 
+0

В вашем случае вы ожидаете, что возвращаемое значение Integer. Я хочу вернуть тот же тип, который указан в вызываемом – Pooya

+0

. Я вернул Integer, потому что я тестировал его с помощью Integer. Это может быть более общим. Я соответствующим образом изменил ответ. – Henri

Смежные вопросы