2012-05-09 11 views
18

Si tengo una clase con un método @PostConstruct, ¿cómo puedo probar su constructor y, por lo tanto, su método @PostConstruct usando JUnit y Spring? No puedo simplemente usar un nuevo ClassName (param, param) porque no está usando Spring: el método @PostConstruct no se activa.¿Cómo probar el constructor de una clase que tiene un método @PostConstruct usando Spring?

¿Me falta algo obvio aquí?

public class Connection { 

private String x1; 
private String x2; 

public Connection(String x1, String x2) { 
this.x1 = x1; 
this.x2 = x2; 
} 

@PostConstruct 
public void init() { 
x1 = "arf arf arf" 
} 

} 


@Test 
public void test() { 
Connection c = new Connection("dog", "ruff"); 
assertEquals("arf arf arf", c.getX1(); 
} 

que tienen algo similar (aunque un poco más compleja) que esto y el método @PostConstruct no consigue golpear.

Respuesta

11

Eche un vistazo a Spring JUnit Runner.

Necesita inyectar su clase en su clase de prueba para que la primavera construya su clase y también llame al método postconstruir. Consulte el ejemplo de la clínica de mascotas.

por ejemplo:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = "classpath:your-test-context-xml.xml") 
public class SpringJunitTests { 

    @Autowired 
    private Connection c; 

    @Test 
    public void tests() { 
     assertEquals("arf arf arf", c.getX1(); 
    } 

    // ... 
+0

Entiendo eso, como dije. Pero, ¿cómo pruebo múltiples permutaciones de este constructor dentro de una clase de prueba? ¿Qué no estoy aclarando sobre mi pregunta? – AHungerArtist

+0

Quiero cinco casos de prueba para el constructor de esta clase. ¿Realmente no hay mejor manera que tener un contexto de aplicación con cinco de esos beans y cargarlo? – AHungerArtist

+0

En tiempo real si hay 5 formas posibles de inyectar su clase, me da miedo decir que tiene que crear 5 definiciones de bean en ese caso. –

0

@PostConstruct debe estar cambiando el estado del objeto. Entonces, en el caso de la prueba JUnit, después de obtener el bean, verifique el estado del objeto. Si es igual que el estado establecido por @PostConstruct, entonces la prueba es exitosa.

+0

El problema no es cómo probar que ha cambiado, sino que @PostConstruct no se está disparando. Editaré mi publicación para que quede más claro. – AHungerArtist

0

Por defecto, la primavera no lo hará consciente de la @PostConstruct y @PreDestroy anotación. Para habilitarlo, debe registrar 'CommonAnnotationBeanPostProcessor' o especificar el '' en el archivo de configuración de bean.

<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" />

o

<context:annotation-config />

17

Si el único contenedor logró parte de Connection es su método @PostContruct, sólo llamar de forma manual en un método de ensayo:

@Test 
public void test() { 
    Connection c = new Connection("dog", "ruff"); 
    c.init(); 
    assertEquals("arf arf arf", c.getX1()); 
} 

Si hay es más que eso, al igual que las dependencias, y así sucesivamente, todavía puedes inyectar de forma manual o, como dijo Sridhar, use el marco de prueba de primavera.

+0

Eso es lo que terminé haciendo. – AHungerArtist

+7

el init puede ser privado –

+0

@shanyangqu Entonces podría usar ReflectionTestUtils o equivalente por ejemplo. Es un código de prueba después de todo. – mrembisz

Cuestiones relacionadas