【发布时间】:2020-10-27 15:59:47
【问题描述】:
我遇到一个问题,我不知道如何编写静态 void 方法的单元测试。
我现在有一个使用 Apache HttpClient 的 HttpHelper 类。如下代码。
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。
我想知道如何测试那些 void 方法。我的概念是在我的测试中创建一个CloseableHttpClient,然后调用HttpHelper.init() 来创建实际的。然后比较我的预期和实际的是否相同。我说的对吗?
由于变量和方法被声明为静态。编写单元测试有点困难。有很多帖子说将方法设为静态是一种不好的做法。但是在我的示例中,我不知道如何避免将它们声明为静态并保留单个 CloseableHttpClient 实例。
谢谢!
【问题讨论】:
-
单元测试的痛苦通常表明代码有异味。也许将
httpClient传递给send()(这样httpClient可以很容易地模拟),或者更改为非静态,并注入httpClient(这样httpClient可以很容易地模拟)。 -
您好,感谢您的回复。但如果我这样做。也许
httpClient不能保留单个实例?
标签: java unit-testing mockito httpclient junit5