Покрытие Jacoco для заявления о смене

Я работаю, чтобы получить 100% покрытие кода для библиотеки, над которой я работаю, и у меня, похоже, есть некоторые проблемы с оператором switch и покрытием, которые я просто не понимаю.

В настоящее время я использую Jacoco 0.7.2, потому что каждая более новая версия, кажется, ломает Robolectrics.

Я тестирую простое утверждение переключателя:

public enum Type {
    NONE, LEGACY, AKS
}

private static Class<?> getCipherClass(Type type) {
    switch (type) {
        case LEGACY:
            return CipherWrapperLegacy.class;
        case AKS:
            return CipherWrapperAks.class;
        default:
            return null;
    }
}

Тест, который я написал, содержит следующие проверки (я должен использовать рефлексию, так как метод является частным):

final CipherWrapper instance = CipherWrapper.createInstance(mockContext, CipherWrapper.Type.LEGACY, ALIAS);
assertNotNull(instance);

Method getCipherMethod = TestUtils.makeMethodAccessible(CipherWrapper.class, "getCipherClass", CipherWrapper.Type.class);
assertNull(getCipherMethod.invoke(instance, CipherWrapper.Type.NONE));
assertEquals(CipherWrapperAks.class, getCipherMethod.invoke(instance, CipherWrapper.Type.AKS));
assertEquals(CipherWrapperLegacy.class, getCipherMethod.invoke(instance, CipherWrapper.Type.LEGACY));

Результат не тот, что я ожидал:

Результат покрытия кода Jacoco

Изображение немного сбивает с толку, поскольку желтая линия говорит о том, что чего-то не хватает. Зеленый значок говорит мне, что 3 из 3 веток покрыты.

Я также проверил, чтобы расширить корпус переключателя с case NONE и провал, но это ничего не изменило.

Единственное, что я могу сделать, это заменить коммутатор на if/else, и тогда я получу 100% покрытие.

В настоящее время у меня 98% покрытия, но я ничего не пропустил на основании обзора: Jacoco общий охват

1 ответ

Решение

Если метод invoke не любит, когда вы вводите анонимную переменную:

getCipherMethod.invoke(instance, (CipherWrapper.Type) null);

Затем попробуйте с именованной переменной:

CipherWrapper.Type nullType = null;
getCipherMethod.invoke(instance, nullType);

Кроме того, вы должны проверить, является ли исключение вызова только оберткой исключения, вызванного вызовом метода, а не ошибкой самого вызова.

Другие вопросы по тегам