摘要:解決方案使用類來解決,根據官方文檔描述,該類主要用于設計直接或間接使用的測試,通過設置的預期請求,來模擬發送回來的響應,來消除對實際請求的依賴。
問題描述:
在我們當前的項目中我們的在請求微信獲取微信企業號的時候調用微信的接口,當我們在測試的時候,我們所測試的方法所使用的接口也是真實的接口,這是不正確的,因為我們的測試目的是測試一下我們的所寫的代碼是否正確,但當我們的代碼依賴于其他組織的網絡配置時,當其他組織的接口出現問題之后,我們的測試就會報錯,所以為了我們的測試不依賴于外部的接口,我們要在測試的時候模擬接口返回數據。
解決方案使用MockRestServiceServer類來解決,根據官方文檔描述,該類主要用于設計直接或間接使用RestTemplate的測試,通過設置RestTemplate的預期請求,來模擬發送回來的響應,來消除對實際請求的依賴。
通過代碼來簡單的介紹一下如何使用
要測試的代碼如下,使用RestTemplate來請求第三方的api。
@Autowired private RestTemplate restTemplate; .... public void synchronizeData() { ..... logger.debug("調用接口,獲取所有的教師"); JSONObject jsonObject = restTemplate.getForEntity(url + "...").getBody(); ..... } .....
測試代碼如下:
先將restTemplate設置成MockRestServiceServer,然后使用MockRestServiceServer來設置預期請求,和模擬返回,然后我們測試的請求就會按我們模擬的數據進行響應。
MockRestServiceServer mockRestServiceServer = MockRestServiceServer.createServer(restTemplate); mockRestServiceServer.expect( ExpectedCount.once(), MockRestRequestMatchers.requestTo(new URI(accessTokenUrl))) .andExpect(MockRestRequestMatchers.method(HttpMethod.GET)) .andRespond(MockRestResponseCreators.withStatus(HttpStatus.OK) .contentType(MediaType.APPLICATION_JSON_UTF8) .body(jsonObjectTocken.toJSONString())); teacherService.synchronizeData();
官方實例如下:
RestTemplate restTemplate = new RestTemplate() MockRestServiceServer server = MockRestServiceServer.bindTo(restTemplate).build(); server.expect(manyTimes(), requestTo("/hotels/42")).andExpect(method(HttpMethod.GET)) .andRespond(withSuccess("{ "id" : "42", "name" : "Holiday Inn"}", MediaType.APPLICATION_JSON)); Hotel hotel = restTemplate.getForObject("/hotels/{id}", Hotel.class, 42); // Use the hotel instance... // Verify all expectations met server.verify();
方法介紹:
bindTo(RestTemplate restTemplate).build()
返回一個用于回復指定RestTemplate的生成器。
createServer(RestTemplate restTemplate)
bindTo().build()的快捷生成方式。
expect(ExpectedCount count, RequestMatcher matcher)
按RequestMatcher設置指定次數請求。
expect(RequestMatcher matcher)
完成單次http請求。
在寫的時候錯誤的使用如下實現方式:
@GetMapping("/students/{studentId}/courses") public ListretrieveCoursesForStudent(@PathVariable String studentId) { return studentService.retrieveCourses(studentId); } Mockito.when( studentService.retrieveCourse(Mockito.anyString(), Mockito.anyString())).thenReturn(mockCourse); RequestBuilder requestBuilder = MockMvcRequestBuilders.get( "/students/Student1/courses/Course1").accept( MediaType.APPLICATION_JSON); MvcResult result = mockMvc.perform(requestBuilder).andReturn();
導致這么寫怎么改都不理想,到后來請教喜碩,發現喜碩快速的通過google找到了正確的解決方案的相關代碼,反思自己還是能力有欠缺不能思考到問題的關鍵點,而且使用英文goole的能力還有待提高。
參考:官方介紹
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/74502.html
摘要:輸出結果需要人工檢查的測試不是一個好的單元測試。為了有效的進行單元測試,需要遵循一定的方法,通常采用路徑覆蓋法設計單元測試用例。 在微服務架構下高覆蓋率的單元測試是保障代碼質量的第一道也是最重要的關口,應該持之以恒。 背景 單元測試為代碼質量保駕護航,是提高業務質量的最直接手段,實踐證明,非常多的缺陷完全可以通過單元測試來發現,測試金字塔提出者Martin Fowler 強調如果一個高...
年輕人都會犯的3個職場錯誤,你有幾個? 測試人員如何才能快速成長? 軟件測試行業,去大公司還是小公司好? 同學們可以用這 10 道題目,找到自己的薄弱點,對癥下藥哦。 我的建議是:你們可以拿出紙筆,寫下這 10 道題的答案,然后再與文末的答案進行對照~ 選擇題 1. (單選)當需要對某個系統進行測試的時候,應該從哪些方面來設計測試用例? A. 功能驗證 B. 性能相關的驗證 C. 兼容性相關的驗...
閱讀 1597·2023-04-25 14:12
閱讀 1070·2021-08-27 16:24
閱讀 2533·2019-08-30 15:44
閱讀 2913·2019-08-30 13:16
閱讀 1665·2019-08-29 14:10
閱讀 966·2019-08-29 13:54
閱讀 1296·2019-08-29 13:09
閱讀 1803·2019-08-26 18:37