MockMvcFeignObjectWrapper.java 1.83 KB
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;
	}
}