2017-05-26 13 views
0

ここで古い質問を調べました。ほとんどの人が言うように、voidメソッドをテストしないでください。発信HTTPリクエストでvoidメソッドをテストします

HTTPリクエストをサーバーに送信する方法がありますが、メソッドが無効であってもテストする必要がありますか?そうでない場合は、dzoneのチュートリアルの多くに、休憩のリクエストをテストする必要があると言われているので、なぜか教えてください。

私はそれをテストする必要がある場合は、私は、ボイドは何も返さないので、それを行う方法をテストししなければならないものを私はに答えることを助けてください。別のものが見えない場合は、私に教えてください。ここで

は方法は次のとおりです。

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"); 
    } 
} 

答えて

0

voidメソッドは何も返しませんが、あなたはそれをテストする方法を持っています。ここで

はそれを行うには、2つの主な方法があります。

  • 理にかなっている方法:メソッドの実装によって生成された副作用をチェックします。 メソッドは何もしません。それで、あなたはそれが何をすべきかを確認することができます。

  • あまり意味のない方法:メソッドの依存関係が呼び出されるときにそのメソッドの依存関係がチェックされます。最後に何もテストしません。
    たとえば、オブジェクトbでメソッドaが呼び出され、その結果がメソッドcのパラメータとして使用されているかどうかを確認/アサートします。 mockingの動作を記録し、レコードが呼び出されたことをテストするテストです。読み込みが不可能で、誤って動作を記録したり、テストでエラーが表示されたりすることはありません。

ことが可能であるとき、ユニットテストは、入力(私がテストしたいデータ)と出力(私が持っていることを期待データ)の原則を支持しなければなりません。

これが私が最初の方法を好む理由です。

あなたのケースでは、あなたのボイドの方法によって生成された出力が可能と思われる:あなたのユニットテストで

if (lastOrderNumber != -1) { 
    observer.setOrderNumber(lastOrderNumber); 
} 

、あなたはobserverフィールドを取得する方法を持っている必要があります。
このようにして、注文番号に期待する内容が含まれていることを確認できます。

1

privateメソッドを直接テストしないでください。関連スレッド:

しかし

  • How do I test a class that has private methods, fields or inner classes?
  • Should I test private methods or only public ones?
  • 、あなたがテストしている場合、あなたはそれを模擬する必要がある、あなたは PowerMock使用することができます - Javaフレームワークをその通常はuntestableと見なされるテストコードをユニット化することができます。コード例: Mockito Mock Private Method Example with PowerMock

    +0

    個人的には、プライベートメソッドをテストする必要があると感じたら、私は「プライベート」修飾子を削除し、com.google.common.annotations.VisibleForTestingでメソッドに注釈を付けます。 – Stormcloud

    関連する問題