这是我的想法,我尝试用MockMvc测试我的Restful控制器
mockMvc = MockMvcBuilders.standaloneSetup(controller).build();
mockMvc.perform(post(...).param(..))
.andExpect(...);
我调用的 API 会触发 rabbitmq 消息。但我不想在测试中测试 Amqp。相反,我创建了一个这样的模拟生产者:
@Mock
private AmqpProducer producer
我想将此生产者注入到 spring 上下文中,以便我可以捕获方法调用producer.sendMessage
并测试消息。
要在 Spring Boot 上下文中模拟 Bean,您不能直接使用 @Mock
。
它将为AmqpProducer
创建一个模拟,但不会为您的容器创建一个模拟。
使用Spring,经典的方法是使用提供模拟的特定上下文配置类或文件(@ContextConfiguration(...)
(来注释测试类。
使用Spring Boot,它更简单:用@WebMvcTest
注释你的类而你用@MockBean
模拟的田地就足以模拟容器中的豆子(弹簧指南(。
请注意,具有注释值中指定的指定控制器类的@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);
}
}