目录
如上图,A 模块依赖于 B 模块,在 B模块不可达的时候,我们对 依赖接口进行了 Mock。
这样在执行测试时,不需要真实的 B 模块便可完成测试。下面我们要用到的 Mock 组件叫 Mockito
springboot-starter-test 自带了对于 mockito 的依赖,下面看一段代码:@Before public void setupMockMvc() throws Exception { // 启用mock @Before public void setupMockMvc() throws Exception { // 启用mock MockitoAnnotations.initMocks(this); polly = new Pet(); polly.setType("Bird"); polly.setName("Polly"); polly.setDescription("the rapid speaker"); lilei = new Customer(); lilei.setName(CUSTOMER); // 设置mock接口 Mockito.when(dataManager.getPets(Mockito.isA(String.class))).thenReturn(Arrays.asList(polly)); Mockito.when(dataManager.getCustomer(Mockito.isA(String.class))).thenReturn(lilei); // 使用standaloneSetup,指定controller // 由于不通过webappliationContext初始化,许多配置不会自动完成,此外bean的初始化方法也不会执行 mockMvc = MockMvcBuilders.standaloneSetup(controller) .setMessageConverters(new MappingJackson2HttpMessageConverter()).build(); } polly = new Pet(); polly.setType("Bird"); polly.setName("Polly"); polly.setDescription("the rapid speaker"); lilei = new Customer(); lilei.setName(CUSTOMER); // 设置mock接口 Mockito.when(dataManager.getPets(Mockito.isA(String.class))).thenReturn(Arrays.asList(polly)); Mockito.when(dataManager.getCustomer(Mockito.isA(String.class))).thenReturn(lilei); // 使用standaloneSetup,指定controller // 由于不通过webappliationContext初始化,许多配置不会自动完成,此外bean的初始化方法也不会执行 mockMvc = MockMvcBuilders.standaloneSetup(controller) .setMessageConverters(new MappingJackson2HttpMessageConverter()).build(); }看到了吗,利用 Mockito 可以实现你想要的 Mock效果,如下:
Mockito.when( somemethod ).thenReturn( some thing to return);然而,在进行 mock 方法时,需要使用 standaloneSetup 的模式,
否则 mockito 无法工作。mockMvc = MockMvcBuilders.standaloneSetup(controller)..关键词
Mockito、MockMvcBuilders五、最后
细心的读者会发现,前面讲了单元测试的对象,是指软件设计的最小单位(方法),可是为什么到了 SpringBoot 的部分时
却都是对于API(Controller层)的测试呢? 到底我们的单元测试应该针对内部实现的某个单元,比如 DAO/Service方法,还是针对接口(API Interface)?笔者认为,这点并没有绝对的好坏之分,关键在于取舍。
单元测试是软件工程领域的概念,而软件项目是分很多种类型的,比如在早期的软件工程中,
就有不少的基于C/S架构的程序,这类程序的体积相对庞大,往往需要对大量模块级的方法进行单元测试;现如今的微服务体系架构中,对于各个子系统来说,API(作为契约)是必须进行测试的。
对于某服务的单元测试,选择 Controller 还是 Service层,取决于你的成本效益考虑,而目前来看,结合敏捷化的 TDD实践、 通过单元测试进行 API测试 已经是一种主流做法。
欢迎继续关注"美码师的补习系列-springboot篇" ,期待更多精彩内容^-^

作者: zale
出处: http://www.cnblogs.com/littleatp/, 如果喜欢我的文章,请关注我的公众号
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出 原文链接 如有问题, 可留言咨询.https://www.cnblogs.com/littleatp/p/9557405.html
