Spring 使用Junit的MockMvc 寫測試用例
阿新 • • 發佈:2019-01-31
怕以後忘掉,隨便寫寫
1、spring配置檔案
該宣告為bean的類就宣告,測試之前專案要能執行,所以spring的配置檔案問題就不多說了,下面的資料庫配置和測試類中負責回滾的TransactionalConfigration註解有關,所以貼出來。
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="mysqlDataSource" /> </bean>
2、pom.xml需要使用的包:
<!-- TEST --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> <scope>test</scope> <exclusions> <exclusion> <artifactId>hamcrest-core</artifactId> <groupId>org.hamcrest</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>3.2.8.RELEASE</version> <scope>test</scope> </dependency> <dependency> <groupId>org.hamcrest</groupId> <artifactId>hamcrest-all</artifactId> <version>1.3</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>1.9.5</version> <scope>test</scope> <exclusions> <exclusion> <artifactId>hamcrest-core</artifactId> <groupId>org.hamcrest</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.jayway.jsonpath</groupId> <artifactId>json-path</artifactId> <version>0.8.1</version> <scope>test</scope> </dependency>
3、測試類
最好在原始碼平行目錄下新建一個測試用的資料夾以及包等
@RunWith(SpringJUnit4ClassRunner.class) @TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)//保證每次測試類執行完後資料庫進行回滾,防止測試時產生髒資料 @Transactional @WebAppConfiguration(value = "mydemo/src/main/webapp") @ContextConfiguration(locations={"file:src/main/webapp/WEB-INF/spring-config.xml"})//如果spring的配置檔案放在WEB-INF目錄下,需要使用這種方法 @ActiveProfiles("dev") public class demoTest { @Autowired WebApplicationContext wac; private MockMvc mockMvc; @Before public void setUp() { mockMvc = MockMvcBuilders.webAppContextSetup(wac).build(); } @Test public void getDemoidTest1() throws Exception { mockMvc.perform(MockMvcRequestBuilders.get("/config/getDemo?demoid=1005")) .andDo(MockMvcResultHandlers.print()) .andExpect(MockMvcResultMatchers.status().isOk()) .andExpect(MockMvcResultMatchers.content().contentType("application/json;charset=UTF-8")) .andExpect(jsonPath("$.code").value(20000)) .andExpect(jsonPath("$.demoList").exists()) .andDo(MockMvcResultHandlers.print()) .andReturn(); } }
1、mockMvc.perform執行一個請求;
2、MockMvcRequestBuilders.get("/user/1")構造一個請求
3、ResultActions.andExpect新增執行完成後的斷言
4、ResultActions.andDo新增一個結果處理器,表示要對結果做點什麼事情,比如此處使用MockMvcResultHandlers.print()輸出整個響應結果資訊。
5、ResultActions.andReturn表示執行完成後返回相應的結果。
4、其中可能遇到的坑:
1)、如果spring的配置檔案在預設的目錄下,使用@ContextConfiguration(locations = "classpath:spring-config.xml")即可
但是!如果spring的配置檔案在WEB-INF目錄下,請使用
@ContextConfiguration(locations={"file:src/main/webapp/WEB-INF/spring-config.xml"})
否則會找不到配置檔案
說到這裡可以提一下為什麼需要載入配置檔案,使用mockMvc,會建立整套完整流程,模擬從前端發出的請求,個人理解為使用這種方法呼叫controller和前端、postman等呼叫controller沒什麼區別,這樣可以測試完整的Spring MVC流程,即從URL請求到控制器處理,再到檢視渲染都可以測試。
2)、執行用例時報這種異常
java.lang.NoSuchMethodError: com.jayway.jsonpath.JsonPath.compile(Ljava/lang/String;[Lcom/jayway/jsonpath/Filter;)Lcom/jayway/jsonpath/JsonPath; 解決方法: 這個異常實在蛋疼,自己感覺一切正常,但是用例就是報異常,後來查了一下,發現了這個解決方法 <dependency> <groupId>com.jayway.jsonpath</groupId> <artifactId>json-path</artifactId> <version>0.8.1</version> <scope>test</scope> </dependency> 嘗試將json-path的版本降低,或者重新載入maven的依賴 剛剛接觸,有錯誤的地方還請各位大牛指出