Java Mockito не работает при вызове MockMvc

Для тестирования я использую MockMvc для отправки POST-запроса к контроллеру, и я хотел бы смоделировать конкретный вызов службы, чтобы он ничего не делал (с Mockito.doNothing()). Если я вызываю этот метод в @Test, он работает отлично, и метод не вызывается. Проблема возникает, когда я делаю mockMvc.perform(..) и выполнение попадает в контроллер, метод doNothing() игнорируется и функция выполняется. Я запускаю тесты Spring MVC в WebApplicationContext.

Это установка:

@Mock
private MyService myService;

@Before
public void setup() {
    MockitoAnnotations.initMocks(this);
}

Эта часть работает. Когда вызывается myFuncToIgnore(), он пропускается.

@Test
public void myTest() throws Exception {
    Mockito.doNothing().when(myService)
    .myFuncToIgnore(isA(String.class), isA(String.class));

    myService.myFuncToIgnore("", "");
}

Эта часть не работает. Когда mockMvc вызывает контроллер, выполняется блок. Обратите внимание, что контроллер вызывает интерфейс, реализация которого вызывает MyService, который представляет собой интерфейс с имплементом, называемым MyServiceImpl). Вот код:

mockMvc.perform(
            post(serviceContextPath)
                    .contentType(MediaType.APPLICATION_JSON)
                    .header("X-Request-Language", "en"))
            .andDo(print())
            .andExpect(status().isOk())
            .andReturn();

У вас есть предложения, пожалуйста?


person patri    schedule 08.11.2017    source источник
comment
Как вы вводите макет в тестируемый контроллер? Можете ли вы опубликовать минимально воспроизводимый пример?   -  person    schedule 08.11.2017
comment
это то, что я хотел бы знать, как. В автономном контексте это можно сделать, используя следующий синтаксис: MockMvcBuilders.standaloneSetup(controllerUnderTest).build(), но для WebApplicationContext я не могу найти рабочий способ сделать это. Предложения, предложенные здесь, не сработали для меня: .com/questions/31819375/   -  person patri    schedule 08.11.2017
comment
С WebApplicationContext вы можете использовать (в xml): <bean id="myService" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="target"> <bean class="org.mockito.Mockito" factory-method="mock"> <constructor-arg value="com.foo.bar.MyService" /> </bean> </property> <property name="proxyInterfaces"> <array> <value>com.foo.bar.MyService</value> </array> </property> </bean> это объявляет MyService, который является макетом   -  person    schedule 08.11.2017
comment
есть ли способ определить его как аннотацию Bean вместо xml? Я сделал следующее: @Configuration static class Config { (At)Bean (At)Primary public ProxyFactoryBean myService() { return Mockito.mock(MyService.class); } } Это правильно? Последнюю часть массива я не смог перевести в Bean Annotation.   -  person patri    schedule 09.11.2017
comment
да, должен работать и с конфигурацией java, но я думаю, что это должно быть @Bean("myService") private ProxyFactoryBean foo() { ProxyFactoryBean pfb = new ProxyFactoryBean(); pfb.setTarget(Mockito.mock(MyService.class)); pfb.setProxyInterfaces(new Class[]{MyService.class}); return pfb; }, чтобы быть эквивалентным   -  person    schedule 09.11.2017
comment
спасибо сработало :)   -  person patri    schedule 09.11.2017