JaCoCo: исключить сгенерированные методы (используя его с Lombok)

Я использую JaCoCo, и он рассматривает методы, созданные Lombok (сгенерированные в байт-коде, а не их след в исходном коде). Как я могу настроить JaCoCo на их игнорирование?


person Federico Tomassetti    schedule 08.04.2015    source источник


Ответы (3)


Используйте тег excludes, предоставленный jacoco.

            <artifactId>jacoco-maven-plugin</artifactId>
            <version>0.7.4.201502262128</version>
            <configuration>
                <excludes>
                    <exclude>**/config/**</exclude>
                    <exclude>**/model/**</exclude>
                    <exclude>**/item/**</exclude>
                </excludes>
            </configuration>
person Naidu    schedule 24.06.2015
comment
Это работает только частично, поскольку они исключают фильтры только для классов фильтров. Думаю, вы бы исключили весь сгенерированный код, а не только классы. Должно работать для @Builder, но не для методов, созданных @Data - все еще обсуждается, см. github.com/jacoco / jacoco / wiki / FilteringOptions. Поскольку lombok добавляет @Generated к сгенерированному коду, JaCoCo должен отфильтровать это, но это отсутствующая функция. - person Arne Burmeister; 23.06.2016
comment
@ArneBurmeister Это потому, что @Generated имеет retention == SOURCE, но JaCoCo анализирует только байт-код, поэтому эта информация отсутствует. - person namero999; 07.07.2016
comment
@ namero999, вы правы, следите за этим, но фильтр аннотаций был бы отличным, поскольку lombok добавляет свою собственную аннотацию lombok.Generated (не ту из javax.annotation). - person Arne Burmeister; 07.07.2016
comment
Jacoco может сделать это прямо сейчас, посмотрите: github.com/jacoco/jacoco/pull/513 (уже слито с мастером) - person Joergi; 12.05.2017
comment
Теперь существует не только специальное решение для Lombok, но и этот метод может привести к тому, что классы, требующие тестирования, не будут проверяться. - person TastyWheat; 16.10.2020

Также еще один способ исключить классы, созданные lombok, начиная с jacoco 0.8.0 и lombok 1.16.14, см .: https://www.rainerhahnekamp.com/en/ignoring-lombok-code-in-jacoco/

К счастью, начиная с версии 0.8.0, Jacoco может обнаруживать, идентифицировать и игнорировать код, созданный Lombok. Единственное, что вам, как разработчику, нужно сделать, это создать файл с именем lombok.config в корне вашего каталога и установить следующий флаг:

lombok.addLombokGeneratedAnnotation = true

Это добавляет аннотацию lombok.@Generated к соответствующим методам, классам и полям. Jacoco знает об этой аннотации и проигнорирует этот аннотированный код.

Имейте в виду, что вам требуется как минимум версия 0.8.0 для Jacoco и v1.16.14 для Lombok.

person ebonnet    schedule 14.08.2018
comment
Я бы хотел, чтобы мы могли настроить это в build.gradle и избежать того, чтобы другой файл оставался в наших репозиториях. - person k.schroeder31; 16.02.2019
comment
Это должен быть правильный ответ. - person Adrián Paredes; 04.05.2021

Как уже было сказано, добавление lombok.config в корневой каталог проекта решает проблему, но если вы используете Maven и хотите избежать добавления lombok.config в свой репозиторий, вы можете использовать Подключаемый модуль Apache Maven AntRun для его автоматического создания при сборке:

<plugins>
   <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-antrun-plugin</artifactId>
      <version>3.0.0</version>
      <executions>
         <execution>
            <id>lombok-config</id>
            <phase>initialize</phase>
            <goals>
               <goal>run</goal>
            </goals>
            <configuration>
               <target>
                  <propertyfile file="lombok.config">
                     <entry key="config.stopBubbling" value="true" />
                     <entry key="lombok.addLombokGeneratedAnnotation" value="true" />
                  </propertyfile>
               </target>
            </configuration>
            <?m2e execute?> <!-- Optional: enable this execution in Eclipse -->
         </execution>
      </executions>
   </plugin>
</plugins>

Не забудьте указать SCM игнорировать этот автоматически созданный файл.

person Robert Hume    schedule 03.05.2020