2016-02-24 10 views
7

Ich habe gerade angefangen, mit Java 8 zu arbeiten. Ich sehe viele Streams und Optionen. Eine Frage kam mir in den Sinn. Betrachten Sie das folgende Beispiel aus this oracle tutorial genommen:Coverage-Bericht in Java 8

String name = computer.flatMap(Computer::getSoundcard) 
          .flatMap(Soundcard::getUSB) 
          .map(USB::getVersion) 
          .orElse("UNKNOWN"); 

Oder den nächsten genommen von here:

List<String> myList = new ArrayList(); 

myList 
    .stream() 
    .filter(s -> s.startsWith("c")) 
    .map(String::toUpperCase) 
    .sorted() 
    .forEach(System.out::println); 

Gibt es eine Lösung der Abdeckung, die mir sagen kann, wenn die orElse im ersten Schnipsel wurde verwendet? Oder eine andere, die mir sagt, dass die filter Schließung überhaupt nicht aufgerufen wurde, da die Liste leer war? Kann irgendjemand melden, dass die Methodenreferenz in forEach nicht verwendet wurde?

+0

Die Datennutzung für Ihren Test un fügen optional ohne Wert und prüfen Sie, dass unbekannt erscheinen. – JEY

+1

Der 'orElse' Aufruf wird immer passieren und sein Argument wird immer vor dem Aufruf ausgewertet, so dass seine Abdeckung keine Auswertung benötigt. Im Fall von Lambda-Ausdrücken werden sie während der Kompilierung in synthetische Methoden entpackt, so dass auch jede aktuelle Code-Abdeckung in der Lage sein sollte, mit ihnen umzugehen. – Holger

+3

Sie können sicherstellen, dass jede Operation in einer "Pipeline" ausgeführt wird, wenn Sie in Ihrem Stream eine "Terminal" -Operation verwenden. Es besteht also keine Notwendigkeit für eine Berichterstattung. – fge

Antwort

1

Zumindest scheint Clover Abdeckung für Verschlüsse zu unterstützen. Siehe this Blogeintrag!

Beispiel in IntelliJ:

enter image description here