ฉันกำลังประสบปัญหา ฉันไม่รู้วิธีเขียน unit test ของวิธี static void
ฉันมีคลาส HttpHelper ที่ใช้ Apache HttpClient ตอนนี้ รหัสเหมือนด้านล่าง
public class HttpHelper {
private static CloseableHttpClient httpClient;
public static void init() {
httpClient = HttpClients.custom().setSSLContext(getDummySSL()).build();
}
public static void closeHttpClient() throws IOException {
httpClient.close();
}
private static SSLContext getDummySSL() {
...omit
}
private static void send() {
HttpGet httpGet = new HttpGet("https://someUrl.com");
try(CloseableHttpResponse httpResponse = httpClient.execute(httpGet)) {
if(httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
responseString = EntityUtils.toString(httpResponse.getEntity());
// do something
} else {
throw new Exception();
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
ดังนั้นในเมนูหลักของฉัน ฉันจะเรียก HttpHelper.init()
เพื่อเริ่มต้น httpClient ทุกครั้งที่ฉันต้องการส่งคำขอ ฉันจะโทร HttpHelper.send()
เพราะฉันไม่ต้องการสร้าง httpClient ใหม่ทุกครั้ง ในตอนท้ายฉันจะโทร HttpHelper.close()
เพื่อปิด httpClient
ฉันสงสัยว่าจะทดสอบวิธีโมฆะเหล่านั้นได้อย่างไร แนวคิดของฉันคือการสร้าง CloseableHttpClient
หนึ่งอันในการทดสอบ จากนั้นโทร HttpHelper.init()
เพื่อสร้างอันจริง จากนั้นเปรียบเทียบอันที่ฉันคาดหวังกับอันจริงที่เหมือนกัน ฉันถูกไหม?
เนื่องจากตัวแปรและวิธีการประกาศเป็นแบบคงที่ การเขียน Unit Test ค่อนข้างยาก มีโพสต์มากมายที่กล่าวว่าการทำให้วิธีการคงที่เป็นแนวทางปฏิบัติที่ไม่ดี อย่างไรก็ตาม ในตัวอย่างของฉัน ฉันไม่รู้วิธีหลีกเลี่ยงการประกาศว่าเป็นแบบคงที่และเก็บอินสแตนซ์ CloseableHttpClient
ไว้เพียงอินสแตนซ์เดียว
ขอบคุณ!
httpClient
ไปที่send()
(เพื่อให้httpClient
สามารถจำลองได้ง่าย) หรือเปลี่ยนเป็นแบบไม่คงที่ และฉีดhttpClient
(เพื่อให้httpClient
สามารถจำลองได้ง่าย) - person Andrew S   schedule 27.10.2020httpClient
ไม่สามารถเก็บอินสแตนซ์เดียวได้ - person rascee   schedule 27.10.2020