摘要:解決方案使用類來解決,根據(jù)官方文檔描述,該類主要用于設(shè)計直接或間接使用的測試,通過設(shè)置的預(yù)期請求,來模擬發(fā)送回來的響應(yīng),來消除對實際請求的依賴。
問題描述:
在我們當(dāng)前的項目中我們的在請求微信獲取微信企業(yè)號的時候調(diào)用微信的接口,當(dāng)我們在測試的時候,我們所測試的方法所使用的接口也是真實的接口,這是不正確的,因為我們的測試目的是測試一下我們的所寫的代碼是否正確,但當(dāng)我們的代碼依賴于其他組織的網(wǎng)絡(luò)配置時,當(dāng)其他組織的接口出現(xiàn)問題之后,我們的測試就會報錯,所以為了我們的測試不依賴于外部的接口,我們要在測試的時候模擬接口返回數(shù)據(jù)。
解決方案使用MockRestServiceServer類來解決,根據(jù)官方文檔描述,該類主要用于設(shè)計直接或間接使用RestTemplate的測試,通過設(shè)置RestTemplate的預(yù)期請求,來模擬發(fā)送回來的響應(yīng),來消除對實際請求的依賴。
通過代碼來簡單的介紹一下如何使用
要測試的代碼如下,使用RestTemplate來請求第三方的api。
@Autowired private RestTemplate restTemplate; .... public void synchronizeData() { ..... logger.debug("調(diào)用接口,獲取所有的教師"); JSONObject jsonObject = restTemplate.getForEntity(url + "...").getBody(); ..... } .....
測試代碼如下:
先將restTemplate設(shè)置成MockRestServiceServer,然后使用MockRestServiceServer來設(shè)置預(yù)期請求,和模擬返回,然后我們測試的請求就會按我們模擬的數(shù)據(jù)進行響應(yīng)。
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()
返回一個用于回復(fù)指定RestTemplate的生成器。
createServer(RestTemplate restTemplate)
bindTo().build()的快捷生成方式。
expect(ExpectedCount count, RequestMatcher matcher)
按RequestMatcher設(shè)置指定次數(shù)請求。
expect(RequestMatcher matcher)
完成單次http請求。
在寫的時候錯誤的使用如下實現(xiàn)方式:
@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();
導(dǎo)致這么寫怎么改都不理想,到后來請教喜碩,發(fā)現(xiàn)喜碩快速的通過google找到了正確的解決方案的相關(guān)代碼,反思自己還是能力有欠缺不能思考到問題的關(guān)鍵點,而且使用英文goole的能力還有待提高。
參考:官方介紹
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/74502.html
摘要:輸出結(jié)果需要人工檢查的測試不是一個好的單元測試。為了有效的進行單元測試,需要遵循一定的方法,通常采用路徑覆蓋法設(shè)計單元測試用例。 在微服務(wù)架構(gòu)下高覆蓋率的單元測試是保障代碼質(zhì)量的第一道也是最重要的關(guān)口,應(yīng)該持之以恒。 背景 單元測試為代碼質(zhì)量保駕護航,是提高業(yè)務(wù)質(zhì)量的最直接手段,實踐證明,非常多的缺陷完全可以通過單元測試來發(fā)現(xiàn),測試金字塔提出者Martin Fowler 強調(diào)如果一個高...
年輕人都會犯的3個職場錯誤,你有幾個? 測試人員如何才能快速成長? 軟件測試行業(yè),去大公司還是小公司好? 同學(xué)們可以用這 10 道題目,找到自己的薄弱點,對癥下藥哦。 我的建議是:你們可以拿出紙筆,寫下這 10 道題的答案,然后再與文末的答案進行對照~ 選擇題 1. (單選)當(dāng)需要對某個系統(tǒng)進行測試的時候,應(yīng)該從哪些方面來設(shè)計測試用例? A. 功能驗證 B. 性能相關(guān)的驗證 C. 兼容性相關(guān)的驗...
閱讀 1658·2023-04-25 14:12
閱讀 1137·2021-08-27 16:24
閱讀 2571·2019-08-30 15:44
閱讀 2943·2019-08-30 13:16
閱讀 1712·2019-08-29 14:10
閱讀 1004·2019-08-29 13:54
閱讀 1337·2019-08-29 13:09
閱讀 1858·2019-08-26 18:37