package com.hotent.feign.mockmvc; import com.hotent.feign.mockmvc.client.MockMvcClient; import org.springframework.context.ApplicationContext; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; import feign.Client; /** * */ public class MockMvcFeignObjectWrapper { private final ApplicationContext applicationContext; private static MockMvc mockMvc; private static MockMvcClient mockMvcClient; public MockMvcFeignObjectWrapper(ApplicationContext applicationContext) { this.applicationContext = applicationContext; } /** * 如果当前的feignClient 不是MockMvcClient 转到MockMvcClient * * @param bean * @return */ Object wrap(Object bean) { if (bean instanceof Client && !(bean instanceof MockMvcClient)) { return getMockMvcClient(applicationContext,(Client) bean); } return bean; } /** * 构造MockMvc对象 单例 由于只有系统启动时 才会调用一次 不会存在并发 不需要考虑并发产生多个实例的问题 * * @return */ private static MockMvc getMockMvc(ApplicationContext applicationContext) { if (mockMvc == null) { mockMvc = MockMvcBuilders.webAppContextSetup((WebApplicationContext) applicationContext).build(); } return mockMvc; } /** * 每个feign使用不同的MockMvcClient对象 * * @param applicationContext * @return */ public static MockMvcClient getMockMvcClient(ApplicationContext applicationContext,Client client) { return new MockMvcClient(getMockMvc(applicationContext),client); } public static MockMvcClient getMockMvcClient(ApplicationContext applicationContext) { return new MockMvcClient(getMockMvc(applicationContext)); } public ApplicationContext getApplicationContext(){ return applicationContext; } }