[JAVA] Comment exclure la couverture générée automatiquement de Jacoco lors de l'utilisation de Lombok

Aperçu

Cette entrée suppose que vous utilisez Lombok, qui génère le code source, et l'outil de mesure de la couverture Jacoco. Je vais préparer un échantillon et présenter comment augmenter la couverture en).

Le but de cette entrée est de servir de point de départ pour augmenter la couverture dans Jacoco sans écrire autant de code que possible en utilisant Lombok. Il n'explique pas toutes les fonctions de chaque outil.

Conclusion

En conclusion, excluons le code généré automatiquement de la cible d'inspection de couverture en spécifiant "lombok.addLombokGeneratedAnnotation = true" du côté lombok en utilisant Jacoco 0.8.0 (publié le 1/2/2018) ou supérieur. , Est un gros point.

Entrée de référence

À Qiita, à propos de Lombok, Jacoco

Il y en a beaucoup (au 26 mai 2018), mais ce qui suit sera utile.

Échantillon initial

À titre d'exemple, j'ai créé Spring Boot pour stocker et afficher des entités simples via le contrôleur REST.

Cela fonctionne comme ça.

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

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

(1 détail)
$ 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

Il est stocké dans Référentiel d'état initial.

Dans cette version, il est implémenté sans utiliser les fonctions pratiques de lombok.

$ ./gradlew test
$ ./gradlew jacocoTestReport

La couverture ressemble à ceci. スクリーンショット 2018-05-26 14.39.51.png

application lombok

@ Data

SampleEntity avant l'application

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

}
Cela ressemble à ceci.

SampleEntity.java


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

Si vous vérifiez avec l'IDE (Eclipse dans cette entrée) auquel le plug Lombok est appliqué, vous pouvez voir que le setter, le getter, toString et hashCode sont générés.

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

@ RequiredArgsConstructor

Lors de l'injection d'un champ avec @Autowired of Spring, il peut être gênant de le remplacer directement pour le test, etc., ou cela peut prendre de la place quand il y a beaucoup de choses à utiliser, alors injectez-le avec le constructeur. Je vais le changer.

SampleApi.java avant que l'application ne soit

SampleApi.java


@RestController
@RequestMapping("/")
public class SampleApi {
    @Autowired
    private SampleFacade sampleFacade;
    
Cela ressemble à ceci.
Notez que le champ est définitif.

SampleApi.java


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

Jusqu'à présent, le rapport jacoco ressemble à ceci.

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

Ici, le package de domaine est une bonne proportion, mais si vous regardez à l'intérieur, c'est naturellement le code généré automatiquement par lombok. Lorsque le comportement de lombok est positif, cela n'a pas beaucoup de sens de tester ce qui est généré.

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

Pour cette raison, spécifions d'exclure le code généré par Lombok du test. Placez le fichier suivant dans le répertoire du projet et recommencez le test.

lombok.config


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

Et la couverture change comme ça. La situation rouge n'a pas changé depuis que je n'ai pas encore écrit le code de test, mais la zone de domaine a été considérablement réduite et l'instruction de code globale a été considérablement réduite de 731 à 170.

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

Une description des valeurs pouvant être spécifiées dans lombok.config peut être trouvée sur le site officiel de lombok.

J'ai mis ce qui précède comme v0.2 sur GitHub.

Ajouter un test

Dans le test unitaire, la couverture est définie à 100% en passant 1 passage pour le moment Sample on GitHub v0.3 Ce sera /releases/tag/v0.3).

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

(Référence) Maintenant, si vous restaurez (ne spécifiez pas) le paramètre d'exclusion, cette situation se produira.

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

Résumé

Dans cette entrée, j'ai vu comment exclure le code généré automatiquement par lombok des mesures de couverture, et j'ai montré à travers un exemple de code au point où cela fonctionne réellement.

En plus d'utiliser la fonction lombok dans l'exemple de cette entrée, Divers sur le site d'origine a été introduit, je voudrais donc présenter un exemple d'utilisation à un autre moment. pense.

Recommended Posts

Comment exclure la couverture générée automatiquement de Jacoco lors de l'utilisation de Lombok
Comment ajouter des caractères à afficher lors de l'utilisation de la méthode link_to
Comment tester avec des images lors de l'utilisation d'ActiveStorage et de Faker
Comment définir des variables d'environnement lors de l'utilisation de Payjp avec Rails
Comment utiliser @Builder (Lombok)
Comment écrire et noter lors de la migration de VB vers JAVA
Comment écrire une option de requête lors de l'utilisation de gem ruby-firebase (memorial)
Sortie de la couverture JaCoCo vers la console
Comment utiliser Lombok maintenant
Comment autoriser à l'aide de graphql-ruby
Comment résoudre l'erreur inconnue apparue lors de l'utilisation de slf4j en Java
[Rails 5] Comment afficher l'écran de changement de mot de passe lors de l'utilisation de l'appareil
Comment définir Lombok dans Eclipse
Comment créer CloudStack à l'aide de Docker
Comment passer du HTML à Haml
Comment renvoyer une valeur du modèle au contrôleur en utilisant le protocole [Swift5]
[Android] Comment transmettre des images et recevoir des rappels lors du partage à l'aide de ShareCompat
Comment trier une liste à l'aide du comparateur
[Rails] Comment convertir ERB en Haml
[Rails] Comment télécharger des images à l'aide de Carrierwave
[Java] Comment calculer l'âge à l'aide de LocalDate
Comment résoudre les erreurs qui se produisent lors de l'installation de Rails 5.1.3
L'histoire de la transition de Spring Boot 1.5 à 2.1
Connectez-vous de Java à MySQL à l'aide d'Eclipse
[Flutter] Comment utiliser C / C ++ depuis Dart?
Modifications lors de la migration de Spring Boot 1.5 vers Spring Boot 2.0
Java: Comment envoyer des valeurs du servlet au servlet
Modifications lors de la migration de Spring Boot 2.0 vers Spring Boot 2.2
Précautions lors de la migration de VB6.0 vers JAVA
[Swift5] Comment mettre en œuvre une animation à l'aide de "lottie-ios"
Pour implémenter la publication d'images à l'aide de rails
Dépannage lors de la montée de Mastodon de la v3.0.x à la v3.1.x
Comment insérer des icônes à l'aide de Font awesome
Comment faire en sorte que la chaîne de requête émette réellement lors de l'utilisation de PreparedStatement dans JDBC