阅读量:0
编写单元测试时我们都习惯性减少重复代码
以下基于spring mvc框架,需要手动pom导包
BaseTest类用于启动上下文进行debug调试
MockBaseTset类用于不启动上下文进行打桩mock
pom.xml
<dependency> <groupId>org.mockito</groupId> <artifactId>mockito-all</artifactId> <version>1.9.5</version> <scope>test</scope> </dependency> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-api-mockito</artifactId> <version>1.6.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-module-junit4</artifactId> <version>1.6.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version> 4.2.5.RELEASE</version> <scope>test</scope> <exclusions> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <scope>test</scope> </dependency>
BaseTest.java
import com.thinkive.gateway.v2.result.Result; import org.codehaus.jackson.map.ObjectMapper; import org.junit.runner.RunWith; import org.powermock.core.classloader.annotations.PowerMockIgnore; import org.springframework.http.HttpHeaders; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.MvcResult; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.result.MockMvcResultMatchers; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import java.util.HashMap; import java.util.Map; /** * @description: 单元测试基类 */ @RunWith(SpringJUnit4ClassRunner.class) //解决@Slf4j报错 @PowerMockIgnore({"javax.script.*","javax.management.*"}) @ContextConfiguration({"classpath*:dubbo_cfg/*.xml", "classpath*:spring-cfg.xml"}) //不用启动 Servlet 容器,就可以获取一个 Web 应用上下文 @WebAppConfiguration public class BaseTest extends Mockito{ private static final ObjectMapper MAPPER = new ObjectMapper(); protected Map<String,String> params = new HashMap<>(); protected Map<String,String> headers = new HashMap<>(); protected MockMvc mockMvc; protected String prefix; /** * POST请求 * @param url * @throws Exception */ protected JsonResult postHttp(String url) throws Exception { MultiValueMap<String, String> multiValueParamMap = new LinkedMultiValueMap<>(); if (params.size() > 0) { multiValueParamMap.setAll(params); } HttpHeaders httpHeaders = new HttpHeaders(); if (headers.size() > 0) { for (String key : headers.keySet()) { httpHeaders.set(key, headers.get(key)); } } params.clear(); MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders .post(prefix + url) .params(multiValueParamMap) .headers(httpHeaders)) .andExpect(MockMvcResultMatchers.status().isOk()) .andReturn(); mvcResult.getResponse().setCharacterEncoding("UTF-8"); mvcResult.getResponse().setContentType("application/json;charset=UTF-8"); String result = mvcResult.getResponse().getContentAsString(); return MAPPER.readValue(result, JsonResult.class); } /** * GET请求 * @param url url后缀 * @return JsonResult * @throws Exception */ protected JsonResult getHttp(String url) throws Exception { MultiValueMap<String, String> multiValueParamMap = new LinkedMultiValueMap<>(); if (params.size() > 0) { multiValueParamMap.setAll(params); } HttpHeaders httpHeaders = new HttpHeaders(); if (headers.size() > 0) { for (String key : headers.keySet()) { httpHeaders.set(key, headers.get(key)); } } MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders .get(prefix + url) .params(multiValueParamMap) .headers(httpHeaders)) .andExpect(MockMvcResultMatchers.status().isOk()) .andReturn(); mvcResult.getResponse().setCharacterEncoding("UTF-8"); mvcResult.getResponse().setContentType("application/json;charset=UTF-8"); String result = mvcResult.getResponse().getContentAsString(); return MAPPER.readValue(result, JsonResult.class); } }
MockBaseTest.java
@RunWith(MockitoJUnitRunner.class) @ActiveProfiles("dev") @PowerMockIgnore("javax.management.*") public class MockBaseTest extends BaseTest{ }
示例:
public class CustControllerTest extends MockBaseTest { @InjectMocks //用于创建一个实例,调用真实的方法 private CustController custController; @Mock private CustService custService; @Before public void init(){ this.prefix = "/api/cust"; //MockitoAnnotations.initMocks(this); //初始化MVC this.mockMvc = MockMvcBuilders.standaloneSetup(custController).build(); } @Test public void testInfoList() throws Exception{ CustInfo custInfo = new CustInfo(); custInfo.setIdNo("4304221955xxxxxxxx"); when(custService.findCustInfo(anyLong())).thenReturn(custInfo); //添加请求参数 params.put("id","1"); //发送post请求 JsonResult jsonResult = postHttp("/info"); String idNo = (List<Map>)((Map)jsonResult.get("info")).get("idNo"); Assert.assertNotNull(idNo); Assert.assertEquals(custInfo.getIdNo(),idNo); } }