Используйте Mockito для регистрации Spring Bean при тестировании mockMvc - PullRequest
2 голосов
/ 14 июня 2019

Вот моя идея, я пытаюсь проверить мой контроллер Restful с MockMvc

mockMvc = MockMvcBuilders.standaloneSetup(controller).build();
mockMvc.perform(post(...).param(..))
       .andExpect(...);

API, который я вызываю, запускает сообщение rabbitmq. Но я не хочу тестировать Amqp в тесте. Вместо этого я создаю фиктивного продюсера, подобного этому:

@Mock
private AmqpProducer producer

Я хочу добавить этого производителя в контекст Spring, чтобы я мог перехватить вызов метода producer.sendMessage и проверить сообщение.

1 Ответ

2 голосов
/ 14 июня 2019

Чтобы высмеивать бин в контексте Spring Boot, вы не можете использовать напрямую @Mock.
Это создаст макет для AmqpProducer, но не тот, который используется вашим контейнером.
В Spring классический способ сделать это - аннотировать ваш тестовый класс конкретным классом конфигурации контекста или файлом (@ContextConfiguration(...)), который предоставляет макет.
С Spring Boot это проще: аннотировать класс с помощью @WebMvcTest и ваше поле для насмешки с @MockBean достаточно для насмешки боба в контейнере ( Spring guide ).

Обратите внимание, что @WebMvcTest с указанным классом контроллера, указанным в значении аннотации, будет создавать экземпляр указанного контроллера, а также всех его объявленных прямых зависимостей. Таким образом, вы должны высмеивать их всех, а не только ту, которая вас интересует в вашем модульном тесте.

Так должно выглядеть:

@RunWith(SpringRunner.class)
@WebMvcTest(MyController.class)
public class WebMockTest {

    @Autowired
    private MockMvc mockMvc;

    @MockBean
    private AmqpProducer producer;

    @Test
    public void foo() throws Exception {
        this.mockMvc.perform(...);
        verify(producer).sendMessage(expected);

    }
}
...