2010-12-07 14 views
7

Tengo una prueba que compara una gran cantidad de XML esperado con el XML real recibido. Si el XML es significativamente diferente, el XML real se escribe en el disco para su análisis y la prueba falla.¿Es posible que la prueba de JUnit indique si se está ejecutando en Eclipse (en lugar de hormiga)

Preferiría usar assertEquals para poder comparar el XML más fácilmente en Eclipse, pero esto podría llevar a registros muy grandes de JUnit y CruiseControl.

Hay una forma en que puedo cambiar el comportamiento de una prueba JUnit dependiendo de si se está ejecutando a través de Eclipse o a través de Ant.

+3

no entiendo por qué ¿assertEquals hace que sea más fácil comparar en Eclipse? Seguramente cualquier herramienta diff lo hará? –

Respuesta

9

Aquí hay 2 soluciones.

propiedades de uso del sistema

boolean isEclipse() { 
    return System.getProperty("java.class.path").contains("eclipse"); 
} 

Uso StackTrace

boolean isEclipse() { 
    Throwable t = new Throwable(); 
    StackTraceElement[] trace = t.getStackTrace(); 
    return trace[trace.length - 1].getClassName().startsWith("org.eclipse"); 
} 
+0

El enfoque "Usar las propiedades del sistema" funcionó para mí, ¡gracias! –

+0

@AlexR Brilliant, nunca pensé en crear una excepción para determinar el contexto de mi llamada actual. Esto está maduro para el abuso, pero parece que hay casos en los que es perfecto. Gracias por esto. – ArtB

0

Por lo general, las características del sistema son diferentes en diferentes entornos. Intente buscar una propiedad del sistema que solo esté configurada por eclipse o hormiga.

BTW: La salida en eclipse es la misma, solo que la consola para eclipse representa la salida en una forma más legible.

Personalmente, no me preocuparía el tamaño de los registros. En general, no es necesario que los guardes por mucho tiempo y el espacio en el disco es barato.

+0

Este sería un comentario interesante para la pregunta, pero definitivamente no es una respuesta útil. – dolmen

2

Sí - se puede comprobar si ciertas propiedades OSGi se establecen (System.getProperty("osgi.instance.area") por ejemplo). Estarán vacíos si junit se inicia a través de la hormiga fuera de de eclipse.

+0

También está vacío desde dentro de Eclipse Juno. :( – dolmen

+0

podría funcionar bien para org.eclipse.osgi ... funciona para el atún – Cshah

0

Con Java 1.6+, parece que el resultado de System.console() hace una diferencia entre correr para Eclipse o de una terminal:

boolean isRealTerminal() 
{ 
    // Java 1.6+ 
    return System.console() != null; 
} 
1

Quizás el enfoque "java.class.path" puede ser débil si se incluye algún frasco de Eclipse en el camino.

Una alternativa podría ser approch para probar "sun.java.command" lugar:

En mi máquina (OpenJDK-8):

sun.java.command org.eclipse.jdt.internal.junit.runner.RemoteTestRunner ... 

Una posible prueba:

boolean isEclipse() { 
    return System.getProperty("sun.java.command") 
     .startsWith("org.eclipse.jdt.internal.junit.runner.RemoteTestRunner"); 
} 
Cuestiones relacionadas