springboot~openfeign從(cong)JSON文件(jian)讀取數據
對openfeign不清楚的同學可以先看我這篇文章:springboot~openfeign從此和httpClient說再見
對(dui)于openfeign來說,幫助我們解決了服(fu)(fu)務(wu)端(duan)(duan)調用服(fu)(fu)務(wu)端(duan)(duan)的(de)(de)問(wen)題,你不(bu)需(xu)(xu)要(yao)關(guan)心服(fu)(fu)務(wu)端(duan)(duan)的(de)(de)URI,只(zhi)需(xu)(xu)要(yao)知道它在(zai)eureka里的(de)(de)服(fu)(fu)務(wu)名(ming)稱即可,同時(shi)你與服(fu)(fu)務(wu)端(duan)(duan)確定了服(fu)(fu)務(wu)方法的(de)(de)參數和返回值(zhi)之(zhi)后,我們可以在(zai)單(dan)元(yuan)測試時(shi)mock這些(xie)服(fu)(fu)務(wu)端(duan)(duan)方法即可,真正做到了單(dan)元(yuan)測試,而不(bu)需(xu)(xu)要(yao)與外界資源(yuan)進(jin)行交互。
今天主要說一下(xia)在(zai)openfeign里(li)讀取JSON文(wen)件(jian)(jian)的問題,我們將(jiang)測(ce)試所(suo)需要的數據(ju)存儲(chu)到文(wen)件(jian)(jian)里(li),在(zai)修改時關注點(dian)比(bi)較單純。
JSON幫助(zhu)類,主要使用(yong)了objectMapper這個對象
/** * 將json轉換為對象. * * @param path 文件路徑 */ public <T> T fromJson(String path, Class<T> cls) { try { return objectMapper.readValue(this.fromResource(path, Charsets.UTF_8), cls); } catch (Exception e) { throw new IllegalStateException("讀取json失敗:" + path, e); } } /** * 將json數(shu)組轉換(huan)為對象(xiang)列(lie)表. * * @param path 文件路徑 */ public <T> List<T> listFromJson(String path, TypeReference typeReference) { try { return objectMapper.readValue(fromResource(path, Charsets.UTF_8), typeReference); } catch (Exception e) { throw new IllegalStateException("讀取json失敗:" + path, e); } }
在Mock類(lei)型(xing)中,可以使用這個(ge)方(fang)法讀JSON文(wen)件(jian)的內容
@Configuration @Profile("integTest") public class ServiceClientMock { @Bean public ServiceClient registerServiceClient() { AccountClient client = mock(AccountClient.class); when(client.del( anyString(), anyString(), anyString(), anyMap())).thenReturn(fromJson("order/orders.json", Map.class)); } }
上(shang)面代(dai)碼(ma)主要在模擬了ServiceClient對象里的(de)del方法,有三個字符(fu)型輸入參數,返回值從JSON文件讀取(qu),在單元(yuan)測試里,直接注入的(de)是ServiceClientMock對象,我們
可以(yi)從@Profile注解里(li)看到(dao),它運行在integTest環境中,在生產環境里(li),將使(shi)用(yong)真正的服務。
感謝各位閱讀!