2016-12-26 5 views
1

Ich habe eine Methode, die ich versuche, Unit-Test. Ich kann den eigentlichen Code nicht schreiben, aber es sieht wie folgt aus:JaCoCo Zweig Abdeckung versuchen Sie mit Ressourcen

public int getTotal() throws MyException { 
    int total = 0; 
    try (ExternalResource externalResource = ExternalService.getResource()) { 
     try (OtherExternal otherResource = externalResource.getOtherResource()) { 
      if (someCondition) { 
       total = otherResource.getTotal(); 
      } 
     } 
    } 
} 

JaCoCo sagt mir, dass ich 4/8 Zweige auf jeder der Try-with-Ressourcenblöcke am fehlt. Ich teste, dass someCondition wahr ist und someCondition ist falsch, und JaCoCo zeigt, dass der Block vollständig abgedeckt ist.

Ich lese this question, und ich verstehe aus der akzeptierten Antwort, dass das Problem darin besteht, wie der Byte-Code generiert wird.

Ich möchte in der Lage sein, besser zu verstehen, wie die verschiedenen Zweige, die generiert werden, zu identifizieren, und dann kann ich ein besseres Urteil darüber machen, ob sie getestet werden oder nicht (sind sie nicht erreichbar, usw.).

+5

Mögliches Duplikat von [8 Verzweigungen für Versuche mit Ressourcen - Jacaco Abdeckung möglich?] (Http://stackoverflow.com/questions/17354150/8-branches-for-try-with-resources-jaccoco-coverage-possible) – Antimony

+0

Ich denke, dass es ziemlich genaue Analysen in den Antworten auf die Frage gibt, die Sie anführen. Wenn das nicht genug ist, könnten Sie bitte mehr über das Unklare ausführen? – Godin

+0

Ich bekomme nicht, wo "ein besseres Urteil darüber treffen soll, ob man sie testet oder nicht" soll zu führen. Es ist unmöglich, unerreichbaren Code zu testen, also muss man nicht "urteilen". Die testbaren Szenarien sollten verstanden werden, ohne in Byte-Codedetails zu gehen - jede Kombination von Vervollständigen des Körpers mit oder ohne Ausnahme und Schließen mit oder ohne Ausnahme. Wenn das Testen dieser Kombinationen nicht alle Pfade abdeckt, gibt es nichts, was Sie tun können, um die verbleibenden zu decken. Vielleicht hilft die Verwendung von ECJ zum Testen, siehe auch [Versuche mit Ressourcen einzuführen unerreichbaren Bytecode] (http://stackoverflow.com/q/25615417) – Holger

Antwort

-2

Sie müssen jede Ausnahme und jede Bedingung testen. Aber JaCoCo konnte manchmal nicht richtig identifizieren, was abgedeckt ist oder nicht.

+1

JaCoCo zeigt genau was auf einer Bytecode-Ebene ausgeführt wurde. Also würde ich nicht "gescheitert" die Tatsache nennen, dass dies nicht gut für Sie aussieht, wenn Sie im Falle von try-with-resource zurück auf den Quellcode abgebildet werden. – Godin

Verwandte Themen