40.3.4 模拟和监视beans

有时候需要在运行测试用例时mock一些组件,例如,你可能需要一些远程服务的门面,但在开发期间不可用。Mocking在模拟真实环境很难复现的失败情况时非常有用。

Spring Boot提供一个@MockBean注解,可用于为ApplicationContext中的bean定义一个Mockito mock,你可以使用该注解添加新beans,或替换已存在的bean定义。该注解可直接用于测试类,也可用于测试类的字段,或用于@Configuration注解的类和字段。当用于字段时,创建mock的实例也会被注入。Mock beans每次调用完测试方法后会自动重置。

下面是一个典型示例,演示使用mock实现替换真实存在的RemoteService bean:

  1. import org.junit.*;
  2. import org.junit.runner.*;
  3. import org.springframework.beans.factory.annotation.*;
  4. import org.springframework.boot.test.context.*;
  5. import org.springframework.boot.test.mock.mockito.*;
  6. import org.springframework.test.context.junit4.*;
  7. import static org.assertj.core.api.Assertions.*;
  8. import static org.mockito.BDDMockito.*;
  9. @RunWith(SpringRunner.class)
  10. @SpringBootTest
  11. public class MyTests {
  12. @MockBean
  13. private RemoteService remoteService;
  14. @Autowired
  15. private Reverser reverser;
  16. @Test
  17. public void exampleTest() {
  18. // RemoteService has been injected into the reverser bean
  19. given(this.remoteService.someCall()).willReturn("mock");
  20. String reverse = reverser.reverseSomeCall();
  21. assertThat(reverse).isEqualTo("kcom");
  22. }
  23. }

此外,你可以使用@SpyBean和Mockito spy包装一个已存在的bean,具体参考文档。