我需要对该代码进行JUnit/Mockito测试,但我不知道如何启动它。我在SO中找不到答案或任何帮助,所以我做了一个新话题。有人可以写一个例子来说明我应该如何做到这一点吗?
@Override
public List<CurrencyList> currencyValuesNBP() {
ArrayList<CurrencyList> currencyListArrayList = new ArrayList<>();
try {
URL url = new URL("http://api.nbp.pl/api/exchangerates/tables/A?format=json");
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setRequestMethod("GET");
httpURLConnection.setRequestProperty("Content-Type", "application/json");
InputStreamReader inputStreamReader = new InputStreamReader(httpURLConnection.getInputStream());
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String jsonOutput = bufferedReader.readLine();
httpURLConnection.disconnect();
ObjectMapper objectMapper = new ObjectMapper();
currencyListArrayList = objectMapper.readValue(jsonOutput, new TypeReference<ArrayList<CurrencyList>>() {
});
} catch (IOException e) {
e.printStackTrace();
}
return currencyListArrayList;
}
我建议使用两种方法来测试您的方法:
- 使用专用的测试服务器 - 在 JUnit 类中,创建一个服务器实例,该实例将在收到方法使用的 URL ('http://api.nbp.pl/api/exchangerates/tables/A?format=json') 时返回固定对象。您可以使用模拟服务器,例如 WireMock,如
ionut
所述。设置服务器后,可以调用经过测试的方法并对其返回值执行所需的检查。这种方法的缺点 - 需要创建一个服务器,如果在方法实现中更改了 URL,则必须更改单元测试代码。 - 将方法重构为核心方法和特定用法,并测试核心方法 - 将代码重构为以下内容:
@Override
public List<CurrencyList> currencyValuesNBP() {
List<CurrencyList> currencyListArrayList = new ArrayList<>();
try {
URL url = new URL("http://api.nbp.pl/api/exchangerates/tables/A?format=json");
ObjectMapper objectMapper = new ObjectMapper();
currencyListArrayList = objectMapper.readValue(handleRESTApiCall(url), new TypeReference<ArrayList<CurrencyList>>() {
});
} catch (IOException e) {
e.printStackTrace();
}
return currencyListArrayList;
}
public String handleRESTApiCall(URL url) {
try {
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setRequestMethod("GET");
httpURLConnection.setRequestProperty("Content-Type", "application/json");
InputStreamReader inputStreamReader = new InputStreamReader(httpURLConnection.getInputStream());
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String jsonOutput = bufferedReader.readLine();
httpURLConnection.disconnect();
return jsonOutput;
} catch (IOException e) {
e.printStackTrace();
}
return "";
}
现在,您可以在URL
实例上使用Mockito
来测试handleRESTApiCall
,而无需服务器实例。缺点是需要在handleRESTApiCall
的输出上添加额外的锅炉镀层,以获得您想要验证的对象。但是,您将受益于一个基本的定期解决方案来处理代码中的 REST api 调用。
参考资料:
- 如何在 java 中模拟 Web 服务器进行单元测试
- 可测试的代码最佳实践