Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用传出HTTP请求测试void方法_Java_Rest_Testing - Fatal编程技术网

Java 使用传出HTTP请求测试void方法

Java 使用传出HTTP请求测试void方法,java,rest,testing,Java,Rest,Testing,我在这里查阅了一些老问题,你们大多数人都说,不要测试无效的方法 我有一个向服务器发送HTTP请求的方法,我认为即使该方法无效,我仍然应该测试它?如果没有,请告诉我原因,因为例如dzone的许多教程都提到应该测试rest请求 如果我应该测试它,请帮助我回答我必须测试的内容,以及我是如何做的,因为void不会返回任何东西。如果你在这里看到另一个禁忌,也请告诉我,我想尽可能提高 方法如下: private void buy(double price) { final String timest

我在这里查阅了一些老问题,你们大多数人都说,不要测试无效的方法

我有一个向服务器发送HTTP请求的方法,我认为即使该方法无效,我仍然应该测试它?如果没有,请告诉我原因,因为例如dzone的许多教程都提到应该测试rest请求

如果我应该测试它,请帮助我回答我必须测试的内容,以及我是如何做的,因为void不会返回任何东西。如果你在这里看到另一个禁忌,也请告诉我,我想尽可能提高

方法如下:

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对该方法进行注释