2017-05-26 2 views
0

Ich habe ein paar ältere Fragen hier bei SO nachgeschlagen und die meisten von Ihnen sagen, testen Sie nicht eine void-Methode.Testen Sie eine void-Methode mit einer ausgehenden HTTP-Anfrage

Ich habe eine Methode, die eine HTTP-Anfrage an einen Server sendet, und ich denke, ich sollte noch testen, dass, selbst wenn die Methode ungültig ist? Wenn nicht, bitte sagen Sie mir, warum, weil viele Tutorials bei dzone zum Beispiel erwähnen, dass Sie Ruhe-Anfragen testen sollten.

Wenn ich es testen sollte, bitte helfen Sie mir zu beantworten, was Ich habe zu testen und wie ich, dass es da Leere nichts zurückliefert. Wenn du ein anderes "Nein" hier siehst, sag mir bitte, ich möchte so viel wie möglich verbessern. Hier

ist die Methode:

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

Antwort

0

Ein void-Methode nichts zurückgibt, aber Sie haben Möglichkeiten, es zu testen.

Hier sind die beiden vor allem Möglichkeiten, es zu tun:

  • Eine Art und Weise, die Sinn macht: die Überprüfung der Nebenwirkung, die durch die Durchführung des Verfahrens erzeugt wird. Eine Methode macht nichts. So können Sie überprüfen, ob es tut, was es tun soll.

  • Ein Weg, der weniger sinnvoll ist: Überprüfen, ob Abhängigkeiten Ihrer Methode aufgerufen werden, da diese aufgerufen werden sollten. Endlich testest du nichts.
    Zum Beispiel überprüfen/bestätigen Sie, dass die Methode a mit dem Objekt b aufgerufen wird und dass ihr Ergebnis in der Methode c als Parameter davon verwendet wird. Es handelt sich um einen Test, der das Mockverhalten aufzeichnet und testet, dass der Datensatz aufgerufen wird. Es ist nicht lesbar und Sie können jedes Verhalten versehentlich aufzeichnen und den Fehler in Ihrem Test nicht sehen.

Ein Unit-Test sollte den Eingang (Daten, die ich testen möchten) begünstigen und Ausgang (Daten, die ich erwarten) Prinzip, wenn es möglich ist.

Deshalb bevorzuge ich den ersten Weg.

In Ihrem Fall die Ausgabe von Ihrer void-Methode erzeugt scheint sein:

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

In Ihrem Gerät zu testen, sollten Sie eine Möglichkeit haben, das observer Feld zu bekommen.
Auf diese Weise können Sie bestätigen, dass es die Bestellnummer mit dem, was Sie erwarten, enthält.

1

Sie sollten private Methoden nicht direkt testen.Verwandte Themen:

Wenn jedoch Sie testen und Sie müssen es verspotten, können Sie PowerMock verwenden - Java-Framework, das ermöglicht es Ihnen, Testcode zu testen, der normalerweise als nicht testbar gilt. Codebeispiel: Mockito Mock Private Method Example with PowerMock

+0

Persönlich, wenn ich das Bedürfnis hatte, eine private Methode zu testen (und ich versuche es nicht), würde ich den Modifikator "private" entfernen und die Methode mit com.google.common.annotations.VisibleForTesting kommentieren – Stormcloud

Verwandte Themen