Как включить private contructor в линейное покрытие?


Я использую jmockit, чтобы издеваться над своими классами в целях модульного тестирования. Пока все работает нормально.

У меня есть фабрика, которая является потокобезопасной и одноэлементной, как показано ниже:

Таким образом, для класса ниже я могу получить покрытие линии 50%, потому что я не могу покрыть частный конструктор TestFactory().

public class TestFactory {

    // not able to cover this
    private TestFactory() {}

    private static class TestHolder {
        private static final TestClient INSTANCE = new TestClient();
    }

    public static IClient getInstance() {
        return TestHolder.INSTANCE;
    }
}

Мой вопрос - есть ли способ, которым я могу покрыть TestFactory() частный конструктор, чтобы я мог получить 100% покрытие линии в моем отчете Cobertura для этого класса?

1 2

1 ответ:

Вызовите его с помощью отражения или просто mockit.Deencapsulation.newInstance(). Напишите такой тестовый метод

@Test
public void privateConstructorCoverage() throws Exception {
   Deencapsulation.newInstance(TestFactory.class);
}

Deencapsulation javadoc

Предоставляет служебные методы, которые обеспечивают доступ к (т. е. "деинкапсулируют") недоступным в противном случае полям, методам и конструкторам, принадлежащим тестируемому коду.