Java 使用传出HTTP请求测试void方法
我在这里查阅了一些老问题,你们大多数人都说,不要测试无效的方法 我有一个向服务器发送HTTP请求的方法,我认为即使该方法无效,我仍然应该测试它?如果没有,请告诉我原因,因为例如dzone的许多教程都提到应该测试rest请求 如果我应该测试它,请帮助我回答我必须测试的内容,以及我是如何做的,因为void不会返回任何东西。如果你在这里看到另一个禁忌,也请告诉我,我想尽可能提高 方法如下:Java 使用传出HTTP请求测试void方法,java,rest,testing,Java,Rest,Testing,我在这里查阅了一些老问题,你们大多数人都说,不要测试无效的方法 我有一个向服务器发送HTTP请求的方法,我认为即使该方法无效,我仍然应该测试它?如果没有,请告诉我原因,因为例如dzone的许多教程都提到应该测试rest请求 如果我应该测试它,请帮助我回答我必须测试的内容,以及我是如何做的,因为void不会返回任何东西。如果你在这里看到另一个禁忌,也请告诉我,我想尽可能提高 方法如下: private void buy(double price) { final String timest
private void buy(double price) {
final String timestamp = String.valueOf(System.currentTimeMillis());
final String amount = String.valueOf(observer.requestedAmount);
final String ressouce = GetValuesTypes.getRessource("user").get(observer.getRelatedUser);
String queryArgs = "wwww.doSomething.com/" + ressouce;
String hmac512 = HMAC512.hmac512Digest(queryArgs);
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpPost post = new HttpPost(GetValuesTypes.getURL());
post.addHeader("Key", GetValuesTypes.getKey());
post.addHeader("Sign", hmac512);
try {
post.setEntity(new ByteArrayEntity(queryArgs.getBytes("UTF-8")));
} catch (UnsupportedEncodingException e) {
System.out.println("Exception in run");
}
List<NameValuePair> params = new ArrayList<>();
params.add(new BasicNameValuePair("command", "order"));
params.add(new BasicNameValuePair("ressource", ressource));
params.add(new BasicNameValuePair("rate", String.valueOf(rate)));
params.add(new BasicNameValuePair("amount", amount));
params.add(new BasicNameValuePair("timestamp", timestamp));
try {
post.setEntity(new UrlEncodedFormEntity(params));
CloseableHttpResponse response = httpClient.execute(post);
HttpEntity entity = response.getEntity();
Scanner in = new Scanner(entity.getContent());
String orderNumber = "";
while (in.hasNext()) {
orderNumber = in.nextLine();
}
String[] findOrderNumber = orderNumber.split(".");
long lastOrderNumber = -1;
try {
lastOrderNumber = Long.valueOf(findOrderNumber[3]);
} catch (NumberFormatException exception) {
System.out.println("NumberFormatException");
} finally {
if (lastOrderNumber != -1) {
observer.setOrderNumber(lastOrderNumber);
}
}
in.close();
EntityUtils.consume(entity);
httpClient.close();
} catch (IOException e) {
System.out.println("Exception occured during process");
}
}
私人无效购买(双倍价格){
最终字符串时间戳=String.valueOf(System.currentTimeMillis());
最终字符串金额=String.valueOf(observer.requestedAmount);
最终字符串ressouce=GetValuesTypes.getRessource(“用户”).get(observer.getRelatedUser);
字符串queryArgs=“www.doSomething.com/”+ressouce;
字符串hmac512=hmac512.hmac512Digest(queryArgs);
CloseableHttpClient httpClient=HttpClients.createDefault();
HttpPost=newhttppost(GetValuesTypes.getURL());
post.addHeader(“Key”,GetValuesTypes.getKey());
post.addHeader(“符号”,hmac512);
试一试{
post.setEntity(新的ByteArrayEntity(queryArgs.getBytes(“UTF-8”));
}捕获(不支持的编码异常e){
System.out.println(“运行中的异常”);
}
List params=new ArrayList();
添加(新的BasicNameValuePair(“命令”、“命令”);
添加(新的BasicNameValuePair(“ressource”,ressource));
添加参数(新的BasicNameValuePair(“rate”,String.valueOf(rate)));
参数添加(新的BasicNameValuePair(“金额”,金额));
add参数(新BasicNameValuePair(“时间戳”,时间戳));
试一试{
post.setEntity(新的UrlEncodedFormEntity(params));
CloseableHttpResponse response=httpClient.execute(post);
HttpEntity=response.getEntity();
Scanner in=new Scanner(entity.getContent());
字符串orderNumber=“”;
while(在.hasNext()中){
orderNumber=in.nextLine();
}
字符串[]findOrderNumber=orderNumber.split(“.”);
long lastOrderNumber=-1;
试一试{
lastOrderNumber=Long.valueOf(findOrderNumber[3]);
}捕获(NumberFormatException异常){
System.out.println(“NumberFormatException”);
}最后{
如果(lastOrderNumber!=-1){
observer.setOrderNumber(lastOrderNumber);
}
}
in.close();
EntityUtils.consume(实体);
httpClient.close();
}捕获(IOE异常){
System.out.println(“过程中发生异常”);
}
}
一个void方法不会返回任何东西,但您有办法测试它
以下是两种主要的方法:
- 一种有意义的方法:检查方法实现产生的副作用方法不会什么都不做。因此,您可以检查它是否做了它应该做的事情
- 一种不太合理的方法:检查方法的依赖项是否在应该调用时被调用。最后你什么也不测试
例如,您只需检查/断言使用对象
调用方法b
,并将其结果用作方法a
的参数。 它是一个记录模拟行为的测试,并测试调用该记录的情况。它不可读,您可以错误地记录任何行为,并且在测试中看不到错误。c
这就是为什么我喜欢第一种方式。
在您的情况下,void方法生成的输出似乎是:
if (lastOrderNumber != -1) {
observer.setOrderNumber(lastOrderNumber);
}
在单元测试中,您应该有一种方法来获取observer
字段通过这种方式,您可以断言它包含您期望的订单号。您不应该直接测试
private
方法。相关线程:
然而,如果您正在进行测试,并且需要对其进行模拟,则可以使用-Java框架,该框架允许您对通常认为不稳定的代码进行单元测试。代码示例:就我个人而言,如果我确实觉得有必要测试私有方法(我尽量不这样做),我会删除“private”修饰符,并使用com.google.common.annotations.VisibleForTesting对该方法进行注释