2010-12-22 19 views
40

Estoy ejecutando EclEmma, ​​el complemento Emma para Eclipse, y el informe de cobertura muestra solo una cobertura parcial para un Enum que he definido, aunque muestra el único valor en Enum como cubierto. Estoy asumiendo que hay una brecha de cobertura para los métodos implícitos que respaldan el Enum, pero no estoy seguro.Cobertura Emma en Enum tipos

Por ejemplo, con esta enumeración, EclEmma destaca todo en verde, a excepción de la declaración del paquete:

package com.blah; 

public enum UserRole { 
HAS_ACCESS 
} 

Si Me tire hacia arriba los detalles de la cobertura de la clase, veo esto:

alt text

Mi pregunta es, ¿cuál es la mejor manera de obtener el 100% de cobertura en mis clases Enum usando EclEmma?

+0

¿Emma no te da detalles sobre lo que te perdiste? Eso parece un poco extraño. –

+0

Mis 2 centavos ya que he estado allí antes y he visto a mis desarrolladores caer en esta trampa. Siente que es más apasionado (que deseado) al alcanzar la cobertura del código del 100%. Esto es solo una pérdida de tiempo. Los informes de la herramienta de cobertura solo deben usarse para identificar oportunidades de mejora del código (o reducir el departamento técnico) y no deben verse como soluciones MUST. –

+0

Estoy de acuerdo, pero si hay una manera simple de obtener la cobertura, no la voy a ignorar. Es un ruido en un informe de cobertura que prefiero no filtrar para llegar a problemas reales. Veo que no tiene advertencias de compilador. No * tengo * para arreglarlos todos, pero no quiero filtrar los menos importantes para ver que tengo uno nuevo que es bastante importante. Por cierto, su respuesta es una no respuesta y habría sido mejor colocarla como comentario. –

Respuesta

51

Lo que está viendo es un bytecode oculto que se genera debido a una enumeración.

Para deshacerse de este problema, agregue una llamada a los métodos values ​​() y valueOf() en la enumeración, como se mencionó anteriormente por Carl Manaster y Peter Lawrey.

+11

Descubrí que todo lo que tenía que hacer era hacer una sola llamada a valueOf y obtuve una cobertura del 100%. Pensé que tendría que hacer más que eso. –

+0

Estaba enfrentando el mismo problema con 'enum' y' classes'. Pude resolver con el caso de 'enum'. Pero mi cobertura de código no está cubriendo en el nombre 'package'. cualquier sugerencia sería útil – Amolb

+0

@Amolb su mejor apuesta es hacer una nueva pregunta con todos los detalles relevantes. Este fue explícitamente sobre 'enum's, no' package's. – deterb

2

Nos encontramos con un problema similar donde el compilador generaba métodos en enumeraciones, como valores(), normalmente no se llamaban en nuestro código de prueba. Solucionamos el problema filtrando los números de nuestros objetos enum de nuestro informe final.

Es por eso que no me gusta usar la cobertura de código como una medida de integridad. Cuando pienso en una mejor métrica, te lo haré saber. :)

+3

Extrayendo esto: quizás podría escribir un método de prueba genérico que tome cualquier enumeración y ejercite sus métodos innatos, solo para deshacerse del ruido del informe de la prueba. Es un poco arriesgado: si hiciera esto con todo, tendría una cobertura de prueba del 100% y no tendría valor de prueba, pero creo que podría satisfacer sus necesidades. –

+2

Puede agregar un exercizer enum genérico que llame a values ​​() y valueOf() al que puede llamar con exerciseEnum (MyEnum.class) –

+1

Gracias por los comentarios. Tiene razón sobre el motivo de la falta de cobertura, pero no creo que ignorar los Enums del informe de cobertura sea el camino correcto. –

9

Estoy de acuerdo con otros carteles que la cobertura del código del 100% puede ser errónea. Pero tengo que admitir que tengo la satisfacción de obtener una cobertura del 100% del código central recién escrito.

Afortunadamente, dado que todas las enum extienden la misma 'clase', puede lograr su 100% con un poco de ayuda de su amigo reflejo.

Simplemente agregue el siguiente método estático en una clase para que los verificadores llamen, utilizando [EnumTypeName] .class como parámetro.

public static void superficialEnumCodeCoverage(Class<? extends Enum<?>> enumClass) { 
    try { 
     for (Object o : (Object[])enumClass.getMethod("values").invoke(null)) { 
     enumClass.getMethod("valueOf", String.class).invoke(null, o.toString()); 
     } 
    } 
    catch (Throwable e) { 
     throw new RuntimeException(e); 
    } 
    } 

Suponiendo que esta función estática se implementa en una clase llamada "compartida", sólo tendría que incluir esta línea para cada enumeración:

Shared.superficialEnumCodeCoverage(UserRole.class); 

La palabra clave es 'superficial'.

+5

La reflexión es el peor tipo de amigo. Un backstabber. –

+2

Esto solo funciona si el método 'toString' no se reemplaza en la clase enum. En ese caso, tendrá que llamar '.name' en su lugar (lo que hace que sea necesario tener' o' de un tipo enum (o al menos de tipo 'Enum '). –

+0

si la enumeración no tiene ningún campo , la cobertura aún está incompleta – datahaki

Cuestiones relacionadas