junit mockito Base基类

avatar
作者
筋斗云
阅读量: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); 	}  }

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!