2012-03-15 26 views
11

Estoy usando EclEmma con Eclipse para ayudarme a saber dónde faltan las pruebas de código en mi proyecto, pero no se llaman todas las pruebas con @RunWith(PowerMockRunner.class) y por lo tanto no probado.Por qué EclEmma no cubre el código con las pruebas con @RunWith (PowerMockRunner.class)

Estoy usando JUnit 4.8.1 con Mockito.

¿Qué podría ser?

+1

¿Podría dar más detalles como la versión de Mockito, PowerMock y EclEmma? – Brice

+0

Hola, estoy usando la versión 2.1.0 de eclEmma, ​​es un error en esa versión, en eclEmma 1.5.x muestra bien la cobertura de las pruebas. – LottaLava

+0

OK, parece que _EclEmma_ ya no usa _Emma_ desde la versión 2.x. Están usando su propia herramienta de cobertura que se llama JaCoCo. Como no conozco la versión de PowerMock que está utilizando, debe probar PowerMock 1.4.11 que incluye algunas correcciones relacionadas con JaCoCo: http://powermock.googlecode.com/svn/trunk/changelog.txt – Brice

Respuesta

0

AFAIK eclEmma, ​​así como muchos otros sistemas de cobertura, modifican sus archivos .class para agregar instrucciones de cobertura. La mayoría de estas herramientas lo hacen en "tiempo de compilación", no en tiempo de ejecución.

PowerMock lugar, así como AspectJ LTW y muchos otros sistemas, manipulan el mismo código de bytes, pero al "tiempo de ejecución":

PowerMock es un marco que se extienden a otras bibliotecas simulacros como EasyMock con capacidades más potentes . PowerMock utiliza un cargador de clases personalizado y manipulación de códigos de bytes para permitir la burla de métodos estáticos, constructores, clases y métodos finales, métodos privados, eliminación de inicializadores estáticos y más.

Tengo un problema similar con ambas EclEmma (varias versiones) y Cobertura en combinación con AspectJ LTW, porque cuando la modificación en tiempo de ejecución de los archivos .class suceda, de alguna manera corrompe la modificación realizada previamente por la herramienta de cobertura.

No he encontrado una solución, pero al menos encontré el síntoma.

La solución correcta sería depurar la instrumentación de PowerMock y descubrir dónde y cómo rompe las herramientas de cobertura. Es un gran problema, para una herramienta de prueba, para romper las herramientas de cobertura, ya que los dos están muy a menudo usan juntos :)

0

Tenemos unas clases estáticas para burlarse. Con clases estáticas burlonas, el complemento de cobertura de código eclEmma no funciona en Eclipse. Así que lo que hicimos es decir, colocado de manera @RunWith (JUnit4.class) (En lugar de @RunWith (PowerMockRunner.class)) antes de la clase y siguientes líneas colocadas en el interior de clase

static { 
PowerMockAgent.initializeIfNeeded(); 
} 

@Rule 
public PowerMockRule rule = new PowerMockRule(); 

Compilado la clase y corrió la clase de prueba. La cobertura del código funciona bien para la clase. Este cambio es solo para ejecutar el complemento eclEmma en Eclipse IDE sin problemas.

Después de escribir casos de prueba, volvimos a cambiar el código a la normalidad. Colocado @RunWith (PowerMockRunner.class) en lugar de @RunWith (JUnit4.class) y comentado el código estático anterior y las líneas de powermockrule.

Cuestiones relacionadas