2015-05-08 2 views
6

У меня есть класс следующим образом:Как добавить переменные статических переменных Jacoco Test Coverage?

public class XConstants { 

    public static final int A_TYPE = 1; 
    public static final int B_TYPE = 2; 
} 

Я использую обе переменные в моих тестах, но когда я исследую тестовое покрытие с Jacoco он показывает% 0 тестовое покрытие для данного класса. Я предполагаю, что это потому, что я никогда не создавал экземпляр этого класса, просто используйте его статические переменные. Я попытался создать экземпляр, а тестовое покрытие -% 100. Как я могу решить эту проблему?

ответ

5

JaCoCo измеряет степень охвата на основе процента байт-кода, который был фактически выполнен. Объявление статического окончательного примитива или константы String не создает байт-код для выполнения, это всего лишь запись внутри пула констант. Только байткодом вы здесь неявный конструктор по умолчанию, как правило, так:

aload_0 
invokespecial Object.<init> 
return 

Так что, когда вы не называете, вы имеете 0%, когда вы называете это, у вас есть 100%.

Мое предложение - игнорировать эту проблему. Вы не должны пытаться достичь 100% -ного охвата, несмотря ни на что. В конце концов, это ничего не гарантирует: даже 100% -ный код может содержать серьезные ошибки.

+0

Спасибо @Tagir, что имеет смысл. Знаете ли вы какие-нибудь обходные пути? Что делать, если я использую Enum? –

+1

Добавлено предложение, что делать. –

1

В нашем проекте мы преодолеть проблему не покрытий для класса, содержащего только константы, создавая закрытый конструктор (по шаблону из java.lang.Math):

private XConstants {} 

, а затем с помощью Trajano commons-testing библиотеки утверждать, что этот конструктор является приватным и вызывать это удовлетворить покрытие:

assertUtilityClassWellDefined(XConstants.class) 
2

вы сделали класс, который может быть обработан, но вы никогда не инстанцировали его, так что технически вы не покрывал этот код. Простое решение для «класса, полного констант», это сделать его интерфейсом. Также обратите внимание, что переменные в интерфейсе по умолчанию общедоступны, статичны и окончательны, поэтому ваш код может выглядеть примерно так:

public interface XConstants { 
    int A_TYPE = 1; 
    int B_TYPE = 2; 
} 
+0

Легко и эффективно. :) Благодаря! – Gorbag