java junit classloader test-runner

java - junit libraries



Ejecute cada JUnit Test con un ClassLoader separado(no, realmente) (2)

MyFaces tiene TestPerClassLoaderRunner que es (a pesar de su nombre) lo que estás buscando.

¿Cómo puedo hacer que JUnit use un ClassLoader por separado para cada clase de prueba que ejecuta?

Estoy escribiendo un JUnit TestRunner para una biblioteca que establece muchas variables estáticas. Básicamente, quiero restablecer todo esto entre cada clase de prueba, sin necesidad de saber cuáles son todos ellos. No quiero estar unido al conocimiento íntimo del marco, ya que cada vez que la biblioteca cambie internamente, mi TestRunner se romperá.

Antes de ir más allá, quiero dejar absolutamente en claro que realmente quiero hacer esto.

  • No tengo control sobre la biblioteca.
  • No tengo la opción de no usar variables estáticas.
  • No quiero usar el reflejo o Powermock, ya que no quiero saber qué está pasando en la biblioteca.
  • No quiero usar la configuración de Maven para los procesos de prueba de horquillas, ya que la utilidad de prueba está vinculada a una herramienta de compilación.

Cada otra respuesta que puedo encontrar en StackOverflow solo dice "no hagas eso", lo cual no es útil. La primera persona que responde con "variables estáticas son tontas" gana una dona.


Al final escribí el mío, basado libremente en otra respuesta (que no funcionó para mí).

Ahora está en GitHub y Maven Central. https://github.com/BinaryTweed/quarantining-test-runner

<dependency> <groupId>com.binarytweed</groupId> <artifactId>quarantining-test-runner</artifactId> <version>0.0.1</version> </dependency>

Para usarlo, anota tus clases de prueba en consecuencia:

@RunWith(QuarantiningRunner.class) @Quarantine({"com.binarytweed"}) public class MyIsolatedTest { ...

La respuesta vinculada no funcionó para mí, ya que la clase de prueba debe cargarse en un ClassLoader separado, ya que entonces todas las clases a las que hace referencia usarán el mismo cargador. La cuarentena es inclusiva (en lugar de exclusiva) ya que necesita las anotaciones de JUnit @Test para ser cargadas por el ClassLoader padre, de lo contrario, JUnit no puede encontrar ningún método comprobable ya que utiliza Class<Test> como clave en un mapa de búsqueda.