2015-12-04 5 views
1

Аннотация:Mock Autowired ExecutorService

У меня есть Spring @Component, который использует autowired ExecutorService как работы бассейна. Я использую JUnit и Mockito для проверки функциональности компонента, и мне нужно высмеять эту службу-исполнитель. Это было тривиально для других автоподключенных членов - общий помощник, и, например, слой DAO легко издеваются, но мне нужна реальная реальная служба.

Код:

@RunWith(MockitoJUnitRunner.class) 
public class MadeUpClassNameTest{ 

    @Mock 
    private ExecutorService executor; 

    @Before 
    public void initExecutor() throws Exception{ 
     executor = Executors.newFixedThreadPool(2); 
    } 

    @InjectMocks 
    private ASDF componentBeingAutowired; 
... 

Это само по себе не работает, результаты invokeAll() всегда пустой список.

Попытка более явно издеваются метод исполнитель также не работает ...

@Test 
public void myTestMethod(){ 
    when(executor.invokeAll(anyCollection())) 
     .thenCallRealMethod(); 
    ... 
} 

Я получаю загадочно сформулированное исключение:

Вы не можете использовать аргумент matchers вне проверки или гася ,

(я думал, что это было раскорчевка?)

Я мог обеспечить способ thenReturn(Answer<>), но я хотел бы, чтобы убедиться, что код на самом деле работает с исполнителем, справедливый бит код посвящен отображению результатов фьючерсов.

Задача Как я могу предоставить реальную (или функционально используемую) службу-исполнитель? В качестве альтернативы, моя сложность в тестировании этого компонента является признаком того, что это плохой дизайн, нуждающийся в рефакторинге или, возможно, плохой тестовый сценарий?

Примечания Я хочу подчеркнуть, что моя проблема НЕ МОЖЕТЕ создать Mockito или Junit. Другие макеты и тесты работают правильно. Моя проблема специфична только для конкретного макета выше.

Использование: Junit 4,12, Mockito 1.10.19, Hamcrest 1,3

ответ

5

Я думаю, следующий код запускается после Ложная впрыскивается.

@Before 
public void initExecutor() throws Exception{ 
    executor = Executors.newFixedThreadPool(2); 
} 

Это приводит к вашей локальной копии executor быть установлен, но не тот, который вводится.

Я бы рекомендовал использовать constructor injection на вашем componentBeingAutowired и создать новый в своем модульном тесте и исключить зависимости Spring. Тогда ваш тест может выглядеть примерно так:

public class MadeUpClassNameTest { 
    private ExecutorService executor; 

    @Before 
    public void initExecutor() throws Exception { 
     executor = Executors.newFixedThreadPool(2); 
    } 

    @Test 
    public void test() { 
     ASDF componentBeingTested = new ASDF(executor); 
     ... do tests 
    } 
} 
-1

Вы можете использовать аннотацию @Spy.

@RunWith(MockitoJUnitRunner.class) 
public class MadeUpClassNameTest{ 

    @Spy 
    private final ExecutorService executor = Executors.newFixedThreadPool(2); 

    .... 

} 
+0

В таком случае я получаю 'org.mockito.exceptions.base.MockitoException: невозможно инициализировать аннотированное поле @Spy «someField». Mockito не может издеваться над этим классом: class java.util.concurrent.Executors $ FinalizableDelegatedExecutorService. Mockito может только высмеивать не-частные и незавершенные классы. Если вы не знаете, почему вы получаете эту ошибку, сообщите в список рассылки. Исключение: java.lang.IllegalStateException: ошибка при вызове java.lang.ClassLoader # findClass' –