[JAVA] So schließen Sie automatisch generierte von der Jacoco-Abdeckung aus, wenn Sie Lombok verwenden

Überblick

In diesem Eintrag wird davon ausgegangen, dass Sie Lombok, das den Quellcode generiert, und das Tool zur Messung der Abdeckung Jacoco verwenden. Ich werde ein Beispiel vorbereiten und vorstellen, wie die Abdeckung in) erhöht werden kann.

Der Zweck dieses Eintrags besteht darin, Ihnen den Einstieg zu erleichtern, wenn Sie Lombok mit möglichst wenig Code verwenden und die Abdeckung in Jacoco erhöhen möchten. Es werden nicht alle Funktionen der einzelnen Tools erläutert.

Fazit

Lassen Sie uns abschließend den automatisch generierten Code vom Ziel der Abdeckungsprüfung ausschließen, indem Sie auf der Lombok-Seite "lombok.addLombokGeneratedAnnotation = true" mit Jacoco 0.8.0 (veröffentlicht am 1/2/2018) oder höher angeben. Ist ein großer Punkt.

Referenzeintrag

In Qiita über Lombok, Jacoco

Es gibt viele (Stand 26. Mai 2018), aber das Folgende wird hilfreich sein.

Erstexemplar

Als Beispiel habe ich Spring Boot erstellt, um einfache Entitäten über REST Controller zu speichern und anzuzeigen.

Es funktioniert so.

(Anmeldung)
$ curl -H 'Content-Type:application/json' -d '{"intField":123}' http://localhost:8080

(Referenz)
$ curl http://localhost:8080/ 
[{"id":"2815cfc6-f908-4c7d-a20b-b2c52953555f","intField":123,"longField":0,"stringField":null,"charField"

(1 Detail)
$ curl http://localhost:8080/2815cfc6-f908-4c7d-a20b-b2c52953555f
{"id":"2815cfc6-f908-4c7d-a20b-b2c52953555f","intField":123,"longField":0,"stringField":null,"charField":"\u0000","byteField":0}hirokis-M

Es wird im Initial State Repository gespeichert.

In dieser Version wird es implementiert, ohne die praktischen Funktionen von lombok zu verwenden.

$ ./gradlew test
$ ./gradlew jacocoTestReport

Die Berichterstattung sieht so aus. スクリーンショット 2018-05-26 14.39.51.png

lombok angewendet

@ Data

SampleEntity vor der Anwendung

SampleEntity.java


public class SampleEntity {
    private SampleId id;
    private int intField;
    private long longField;
    private String stringField;
    private char charField;
    private byte byteField;
    /**
     * @return the id
     */
    public SampleId getId() {
        return id;
    }
    /**
     * @param id the id to set
     */
    public void setId(SampleId id) {
        this.id = id;
    }
    /**
     * @return the intField
     */
    public int getIntField() {
        return intField;
    }
    /**
     * @param intField the intField to set
     */
    public void setIntField(int intField) {
        this.intField = intField;
    }
    /**
     * @return the longField
     */
    public long getLongField() {
        return longField;
    }
    /**
     * @param longField the longField to set
     */
    public void setLongField(long longField) {
        this.longField = longField;
    }
    /**
     * @return the stringField
     */
    public String getStringField() {
        return stringField;
    }
    /**
     * @param stringField the stringField to set
     */
    public void setStringField(String stringField) {
        this.stringField = stringField;
    }
    /**
     * @return the charField
     */
    public char getCharField() {
        return charField;
    }
    /**
     * @param charField the charField to set
     */
    public void setCharField(char charField) {
        this.charField = charField;
    }
    /**
     * @return the byteField
     */
    public byte getByteField() {
        return byteField;
    }
    /**
     * @param byteField the byteField to set
     */
    public void setByteField(byte byteField) {
        this.byteField = byteField;
    }
    /* (non-Javadoc)
     * @see java.lang.Object#hashCode()
     */
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + byteField;
        result = prime * result + charField;
        result = prime * result + ((id == null) ? 0 : id.hashCode());
        result = prime * result + intField;
        result = prime * result + (int) (longField ^ (longField >>> 32));
        result = prime * result
                + ((stringField == null) ? 0 : stringField.hashCode());
        return result;
    }
    /* (non-Javadoc)
     * @see java.lang.Object#equals(java.lang.Object)
     */
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        SampleEntity other = (SampleEntity) obj;
        if (byteField != other.byteField)
            return false;
        if (charField != other.charField)
            return false;
        if (id == null) {
            if (other.id != null)
                return false;
        } else if (!id.equals(other.id))
            return false;
        if (intField != other.intField)
            return false;
        if (longField != other.longField)
            return false;
        if (stringField == null) {
            if (other.stringField != null)
                return false;
        } else if (!stringField.equals(other.stringField))
            return false;
        return true;
    }
    /**
     * @param id
     * @param intField
     * @param longField
     * @param stringField
     * @param charField
     * @param byteField
     */
    public SampleEntity(SampleId id, int intField, long longField,
            String stringField, char charField, byte byteField) {
        super();
        this.id = id;
        this.intField = intField;
        this.longField = longField;
        this.stringField = stringField;
        this.charField = charField;
        this.byteField = byteField;
    }

    public SampleEntity() {
        super();
    };

}
Es sieht so aus.

SampleEntity.java


@Data
public class SampleEntity {
    private SampleId id;
    private int intField;
    private long longField;
    private String stringField;
    private char charField;
    private byte byteField;
}

Wenn Sie mit der IDE (Eclipse in diesem Eintrag) überprüfen, auf die der Lombok-Plug angewendet wird, können Sie sehen, dass Setter, Getter, toString und HashCode generiert werden.

スクリーンショット 2018-05-26 14.53.59.png

@ RequiredArgsConstructor

Wenn Sie ein Feld mit @Autowired of Spring injizieren, kann es schwierig sein, es direkt zum Testen usw. zu ersetzen, oder es kann Platz beanspruchen, wenn viele Dinge zu verwenden sind. Injizieren Sie es daher mit dem Konstruktor. Ich werde es ändern.

SampleApi.java vor der Anwendung ist

SampleApi.java


@RestController
@RequestMapping("/")
public class SampleApi {
    @Autowired
    private SampleFacade sampleFacade;
    
Es sieht so aus.
Beachten Sie, dass das Feld endgültig ist.

SampleApi.java


@RestController
@RequestMapping("/")
@RequiredArgsConstructor
public class SampleApi {
    private final SampleFacade sampleFacade;    

Bisher sieht der Jacoco-Bericht so aus.

スクリーンショット 2018-05-26 15.10.35.png

Hier ist das Domain-Paket ein guter Anteil, aber wenn Sie hineinschauen, ist es natürlich der Code, der automatisch von lombok generiert wird. Wenn das Verhalten von Lombok positiv ist, ist es wenig sinnvoll zu testen, was erzeugt wird.

スクリーンショット 2018-05-26 15.07.45.png

Aus diesem Grund geben wir an, dass der von Lombok generierte Code vom Test ausgeschlossen werden soll. Legen Sie die folgende Datei in das Projektverzeichnis und wiederholen Sie den Test.

lombok.config


lombok.addLombokGeneratedAnnotation = true 
$ ./gradlew clean
$ ./gradlew test
$ ./gradlew jacocoTestReport 

Und die Abdeckung ändert sich so. Die rote Situation hat sich nicht geändert, seit ich den Testcode noch nicht geschrieben habe, aber der Domänenbereich wurde stark reduziert, und die Gesamtcode-Anweisung wurde von 731 auf 170 erheblich reduziert.

スクリーンショット 2018-05-26 15.17.31.png

Eine Beschreibung der Werte, die in lombok.config angegeben werden können, finden Sie auf der offiziellen Website von lombok.

Ich habe das oben genannte als v0.2 auf GitHub.

Test hinzufügen

Im Unit-Test wird die Abdeckung auf 100% festgelegt, indem vorerst 1 Durchgang bestanden wird Beispiel auf GitHub v0.3 Es wird /releases/tag/v0.3 sein).

スクリーンショット 2018-05-26 17.09.12.png

(Referenz) Wenn Sie nun die Ausschlusseinstellung wiederherstellen (nicht angeben), tritt diese Situation auf.

スクリーンショット 2018-05-26 17.13.05.png

Zusammenfassung

In diesem Eintrag habe ich gesehen, wie der automatisch generierte Code von lombok von Abdeckungsmessungen ausgeschlossen werden kann, und ich habe den Beispielcode bis zu dem Punkt gezeigt, an dem er tatsächlich funktioniert.

Zusätzlich zur Verwendung der Lombok-Funktion im Beispiel dieses Eintrags wurde Verschiedene auf der ursprünglichen Website eingeführt, daher möchte ich zu einem anderen Zeitpunkt ein Verwendungsbeispiel vorstellen. Überlegen.

Recommended Posts

So schließen Sie automatisch generierte von der Jacoco-Abdeckung aus, wenn Sie Lombok verwenden
Hinzufügen von Zeichen zur Anzeige bei Verwendung der link_to-Methode
Testen des Einschlusses von Bildern bei Verwendung von ActiveStorage und Faker
Festlegen von Umgebungsvariablen bei Verwendung von Payjp mit Rails
Verwendung von @Builder (Lombok)
Schreiben und Notizen bei der Migration von VB zu JAVA
So schreiben Sie eine Abfrageoption bei Verwendung von gem ruby-firebase (Denkmal)
Geben Sie die JaCoCo-Abdeckung an die Konsole aus
Wie man Lombok jetzt benutzt
So autorisieren Sie mit graphql-ruby
So beheben Sie den unbekannten Fehler, der bei der Verwendung von slf4j in Java aufgetreten ist
[Rails 5] Anzeigen des Bildschirms zum Ändern des Kennworts bei Verwendung von devise
So setzen Sie Lombok in Eclipse
So erstellen Sie CloudStack mit Docker
So wechseln Sie von HTML zu Haml
Zurückgeben eines Werts vom Modell an den Controller mithilfe des [Swift5] -Protokolls
[Android] Übergeben von Bildern und Empfangen von Rückrufen beim Teilen mit ShareCompat
So sortieren Sie eine Liste mit Comparator
[Rails] Wie man von erb zu haml konvertiert
[Rails] So laden Sie Bilder mit Carrierwave hoch
[Java] So berechnen Sie das Alter mit LocalDate
So beheben Sie Fehler, die während der Installation von Rails 5.1.3 auftreten
Die Geschichte des Übergangs von Spring Boot 1.5 zu 2.1
Stellen Sie mit Eclipse eine Verbindung von Java zu MySQL her
[Flattern] Wie verwende ich C / C ++ von Dart?
Änderungen bei der Migration von Spring Boot 1.5 auf Spring Boot 2.0
Java: So senden Sie Werte von Servlet zu Servlet
Änderungen bei der Migration von Spring Boot 2.0 zu Spring Boot 2.2
Vorsichtsmaßnahmen bei der Migration von VB6.0 auf JAVA
[Swift5] So implementieren Sie Animationen mit "lottie-ios"
So implementieren Sie die Image-Veröffentlichung mithilfe von Schienen
Fehlerbehebung beim Anheben von Mastodon von v3.0.x auf v3.1.x.
So fügen Sie Symbole mit Font awesome ein
So wird die Abfragezeichenfolge bei Verwendung von PreparedStatement in JDBC tatsächlich ausgegeben