2012-07-22 26 views
7

Escribí una interfaz MyInterface, que será implementada por diferentes implementadores.Clase de prueba genérica de JUnit

También escribí una clase MyInterfaceTest, que contiene métodos de prueba genéricos que todos los implementadores deberían poder usar para probar sus implementaciones.

Simplemente no sé cómo hacer que funcione como una prueba JUnit.

Actualmente, tengo algo como esto:

public class MyInterfaceTest { 
    private static MyInterface theImplementationToTest = null; 

    @BeforeClass public static void setUpBeforeClass() throws Exception { 
       // put your implementation here: 
     theImplementationToTest = new Implementation(...); 
    } 

    @AfterClass public static void tearDownAfterClass() throws Exception { 
     theImplementationToTest = null; 
    } 

    @Test public void test1() { /* uses theImplementationToTest */ }  
    @Test public void test2() { /* uses theImplementationToTest */ }  
} 

uso el método estático setUpBeforeClass debido a que la inicialización de cada aplicación requiere mucho tiempo, por lo que quiero para inicializar una vez para todas las pruebas.

Con esta versión de la prueba, los implementadores tienen que cambiar el código de setUpBeforeClass y poner su propia implementación.

Estoy seguro de que hay otra forma de escribir MyInterfaceTest, por lo que los implementadores solo tendrán que heredarlo o enviarle un parámetro, y no cambiar el código. Sin embargo, no tengo suficiente experiencia en JUnit para que funcione. ¿Puedes mostrarme cómo hacer esto?

Respuesta

6

Puede hacer que la subclase implemente solo el método de clase anterior y heredar todas las pruebas.

import org.junit.*; 

public class ImplementingClassTest extends MyInterfaceTest { 

    @BeforeClass 
    public static void setUpBeforeClass() throws Exception { 
     // put your implementation here: 
     theImplementationToTest = new MyInterfaceImpl(); 
    } 

} 

Esto hace que la clase abstracta que está escribiendo el siguiente aspecto:

import org.junit.*; 

public abstract class MyInterfaceTest { 
    protected static MyInterface theImplementationToTest = null; 

    @AfterClass 
    public static void tearDownAfterClass() throws Exception { 
     theImplementationToTest = null; 
    } 

    @Test 
    public void test1() { /* uses theImplementationToTest */ 
    } 

    @Test 
    public void test2() { /* uses theImplementationToTest */ 
    } 
} 

Normalmente, haría que el método de las subclases necesarios para implementar abstracto. No puedo hacer eso aquí ya que es un método de configuración estático. (Además, es posible que desee refactorizar las instancias para que no tarden mucho, ya que a menudo es un antipatrón).

-3

Debe descargar un jar nombres junit-4.10.jar y agregarlo a su proyecto. Luego, deje que su clase MyInterfaceTest herede la clase llamada TestCase, como public class MyInterfaceTest extends TestCase.

+1

¿Cómo ayuda eso a resolver el problema original? –

+0

¿Cuál es el problema original? –

+0

Cómo reutilizar una instalación/desmontaje estático con implementación que varía según la subclase. Como se describe en mi respuesta. –