java - simple - ¿Cómo probar el constructor de una clase que tiene un método @PostConstruct usando Spring?
para que sirve el comando super en java (4)
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 el nuevo ClassName (param, param) porque entonces no está usando Spring, el método @PostConstruct no se está activando.
¿Me estoy perdiendo 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();
}
Tengo algo similar (aunque un poco más complejo) que esto y el método @PostConstruct no se ve afectado.
De forma predeterminada, Spring no tendrá conocimiento de las anotaciones @PostConstruct y @PreDestroy. Para habilitarlo, debe registrar ''CommonAnnotationBeanPostProcessor'' o especificar el '''' en el archivo de configuración del bean.
<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" />
o
<context:annotation-config />
Echa un vistazo a Spring JUnit Runner .
Necesita inyectar su clase en su clase de prueba para que Spring construya su clase y también llame al método de construcción posterior. Consulte el ejemplo de la clínica de mascotas.
p.ej:
@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();
}
// ...
Si la única parte administrada del contenedor de Connection
es su método @PostContruct
, simplemente @PostContruct
manualmente en un método de prueba:
@Test
public void test() {
Connection c = new Connection("dog", "ruff");
c.init();
assertEquals("arf arf arf", c.getX1());
}
Si hay más que eso, como las dependencias, etc., aún puede inyectarlos manualmente o, como lo indicó Sridhar, usar el marco de prueba de primavera.
@PostConstruct
debe estar cambiando el estado del objeto. Entonces, en el caso de prueba de JUnit, después de que el bean verifique el estado del objeto. Si es igual al estado establecido por @PostConstruct
, entonces la prueba es exitosa.