怕以後忘掉,隨便寫寫
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的依賴
剛剛接觸,有錯誤的地方還請各位大牛指出