Gradle - задачи jacoco добавляют синтетические поля при запуске приложения Spring, что приводит к сбою тестов при подсчете количества объявленных полей в классе - PullRequest
0 голосов
/ 17 октября 2018

У меня есть этот класс:

public class UserPurchaseUtil {
    public static final String JSON_PROP_ID = "id";
    public static final String JSON_PROP_USER_ID = "user_id";
    // See Confluence: First Time Member Promotion (FTM)
    public static final String JSON_PROP_LAST_PURCHASE_TIME = "last_purchase_time";

}

Затем я хочу убедиться, что я обращаю внимание на все изменения значений в этом классе, с помощью «обратите внимание», я хочу убедиться, что

  • каждый раз, когда я удаляю или добавляю некоторые константы, тест не пройден;
  • проверяются все значения.

Итак, у меня есть этот тест:

@Slf4j
@RunWith(MockitoJUnitRunner.class)
public class UserPurchaseUtilTest {

    @Test
    public void testNumberOfConstantsAndTheirValues() {
        int numberOfConstants = UserPurchaseUtil.class.getDeclaredFields().length;
        // just to ensure we test all the constants' values when we add new ones. Now is 3.
        Assert.assertEquals(3, numberOfConstants);

        Assert.assertEquals("id", UserPurchaseUtil.JSON_PROP_ID);
        Assert.assertEquals("user_id", UserPurchaseUtil.JSON_PROP_USER_ID);
        Assert.assertEquals("last_purchase_time", UserPurchaseUtil.JSON_PROP_LAST_PURCHASE_TIME);
    }
}

Но этот простой тест не пройден:

expected:<3> but was:<4>
Expected :3
Actual   :4
 <Click to see difference>

Тогда почему?

РЕДАКТИРОВАТЬ:

OMG.Теперь при отладке я вижу четвертое поле.

private static transient boolean[] com.xxx.utils.UserPurchaseUtil.$jacocoData

Это проект Spring Boot.

enter image description here

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Gradle jacoco связанные задачи, такие как jacocoTestReport и jacocoTestCoverageVerification мешают моей проверке отражения всех классов.

Я обнаружил эту проблему:

https://github.com/jacoco/jacoco/issues/168

Мой код использует отражение.Почему происходит сбой при выполнении с помощью JaCoCo?

Для сбора данных выполнения JaCoCo обрабатывает тестируемые классы, которые добавляют к классам два члена: личное статическое поле $ jacocoData и частный статический метод $jacocoInit ().Оба участника помечены как синтетические.

Пожалуйста, измените код, чтобы игнорировать синтетические члены.В любом случае, это хорошая практика, так как компилятор Java создает искусственные элементы в определенных ситуациях.

Я думаю, что в этом случае я должен игнорировать синтетические элементы при подсчете.isSynthetic() означает, что член добавляется во время выполнения компилятором (вроде).

Так что это будет выглядеть так:

int nonSynthetic = 0;
Field[] allFields = UserPurchaseUtil.class.getDeclaredFields();
for (Field f: allFields) {
    // ignore synthetic methods, which are added at runtime by jacoco (or other libraries)
    if (!f.isSynthetic()) {
        nonSynthetic ++;
    }
}
Assert.assertEquals(3, nonSynthetic);
0 голосов
/ 17 октября 2018

Итак, в вашем классе есть дополнительные поля, добавленные вашими библиотеками, создайте список исключений, чтобы игнорировать поля, соответствующие некоторым именам / шаблонам.
Может быть, просто игнорировать переходные поля?Или получить только открытые поля?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...