Почему EclEmma не содержит код покрытия с помощью тестов с помощью @RunWith (PowerMockRunner.class)
Я использую EclEmma с Eclipse, чтобы помочь мне узнать, где в моем проекте отсутствуют тесты кода, но все тесты с @RunWith(PowerMockRunner.class)
не вызываются и, следовательно, не проверяются.
Я использую JUnit 4.8.1 с Mockito.
Что это может быть?
Ответы
Ответ 1
Известная ошибка для обеих сторон:
http://code.google.com/p/powermock/issues/detail?id=402
https://github.com/jacoco/eclemma/issues/15#issuecomment-9565210
eCoberture, тем не менее, обеспечивает правильный охват. Единственная проблема, которая, кажется, больше не поддерживается, и вы не можете удалить ярлыки im Eclipse Juno.
Ответ 2
Здесь вы можете найти пример, который работает и может помочь вам решить эту проблему
https://github.com/Godin/jacoco-experiments
используйте mvn clean package
, чтобы увидеть отчет jacoco
Ответ 3
AFAIK eclEmma, а также многие другие системы покрытия, измените ваши .class файлы, чтобы добавить инструкции покрытия. Большинство этих инструментов делают это во время компиляции, а не во время выполнения.
PowerMock вместо этого, а также AspectJ LTW и многие другие системы управляют одним и тем же байт-кодом, но в "время выполнения":
PowerMock - это платформа, которая расширяет другие макетные библиотеки, такие как EasyMock, с более мощными возможностями. PowerMock использует настраиваемую загрузку классов и байт-кода, чтобы включить издевательство над статическими методами, конструкторами, конечными классами и методами, частными методами, удалением статических инициализаторов и т.д.
У меня есть аналогичная проблема как с eclEmma (различные версии), так и с Cobertura в сочетании с AspectJ LTW, потому что когда происходит модификация файлов .class во время выполнения, это как-то искажает модификацию, выполненную ранее инструментом охвата.
Я еще не нашел решение, но, по крайней мере, нашел симптом.
Правильным решением было бы отладить инструментарий PowerMock и выяснить, где и как он разбивает инструменты покрытия. Это довольно проблема для инструмента тестирования, чтобы разбить инструменты покрытия, поскольку эти два довольно часто используются вместе:)
Ответ 4
У нас есть статические классы для макета. С издевательскими статическими классами плагин eclEmma для покрытия кода не работает в Eclipse. Итак, что мы сделали, поэтому разместил @RunWith (JUnit4.class) (вместо @RunWith (PowerMockRunner.class)) перед классом и разместил следующие строки внутри класса
static {
PowerMockAgent.initializeIfNeeded();
}
@Rule
public PowerMockRule rule = new PowerMockRule();
Скомпилировал класс и запустил тестовый класс. Покрытие кода отлично работает для класса. Это изменение заключается только в том, чтобы запустить плагин eclEmma в среде Eclipse без проблем.
После написания тестовых примеров мы вернули код в норму. Разместил @RunWith (PowerMockRunner.class) вместо @RunWith (JUnit4.class) и прокомментировал выше статические коды и строки powermockrule.