web-dev-qa-db-fra.com

Comment tester le constructeur d'une classe qui a une méthode @PostConstruct utilisant Spring?

Si j'ai une classe avec une méthode @PostConstruct, comment puis-je tester son constructeur et donc sa méthode @PostConstruct en utilisant JUnit et Spring? Je ne peux pas simplement utiliser new ClassName (param, param), car il n'utilise pas Spring - la méthode @PostConstruct n'est pas renvoyée.

Est-ce que je manque quelque chose d'évident ici?

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();
}

J'ai quelque chose de similaire (quoique légèrement plus complexe) que cela et la méthode @PostConstruct ne soit pas touchée.

21
AHungerArtist

Regardez Spring JUnit Runner .

Vous devez injecter votre classe dans votre classe de test pour que spring construise votre classe et appelle également la méthode post-construction. Reportez-vous à l'exemple de la clinique pour animaux de compagnie.

par exemple:

@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();
    }

    // ...
12
Sridhar G

Si la seule partie gérée par conteneur de Connection est votre méthode @PostContruct, appelez-la simplement dans une méthode de test:

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

S'il y a plus que cela, comme des dépendances et ainsi de suite, vous pouvez toujours les injecter manuellement ou - comme l'a dit Sridhar - utiliser le cadre de test du ressort.

21
mrembisz

Par défaut, Spring n'aura pas connaissance des annotations @PostConstruct et @PreDestroy. Pour l’activer, vous devez soit enregistrer «CommonAnnotationBeanPostProcessor», soit spécifier le «‘ dans le fichier de configuration du bean.

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

ou

<context:annotation-config />

0
Dandy

@PostConstruct doit modifier l'état de l'objet. Ainsi, dans le cas test JUnit, après avoir obtenu le bean, vérifiez l’état de l’objet. S'il est identique à l'état défini par @PostConstruct, le test est réussi.

0
Dandy