Spring 使用Junit的MockMvc 寫測試案例__測試

來源:互聯網
上載者:User

怕以後忘掉,隨便寫寫

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的依賴
剛剛接觸,有錯誤的地方還請各位大牛指出






聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.