SpringJUnit4ClassRunner initialiser les haricots pour chaque test?
Le test suivant illustre le fait que ce test bean est initialisé à deux reprises par le Printemps. J'espère que quelqu'un peut me dire pourquoi il en est ainsi, car il ne doit être fait une fois. Voici le test:
import org.apache.log4j.Logger;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {} )
public class TestAfterPropsSet implements InitializingBean {
private static final Logger logger = Logger.getLogger(TestAfterPropsSet.class);
@Test
public void test1() {
logger.debug("Test1");
}
@Test
public void test2() {
logger.debug("Test2");
}
public void afterPropertiesSet() throws Exception {
logger.debug("Bean Initialized");
}
} //end class
Voici la fève de fichier:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
et voici le résultat:
2009-10-13 21:20:04,393 [TestAfterPropsSet.java 26] DEBUG - Bean Initialized
2009-10-13 21:20:04,393 [TestAfterPropsSet.java 17] DEBUG - Test1
2009-10-13 21:20:04,393 [TestAfterPropsSet.java 26] DEBUG - Bean Initialized
2009-10-13 21:20:04,393 [TestAfterPropsSet.java 22] DEBUG - Test2
OriginalL'auteur harschware | 2009-10-14
Vous devez vous connecter pour publier un commentaire.
Ce n'est pas un Printemps de la convention. Vous devriez être à la suite JUnit conventions, à savoir la suite à l'échelle de l'initialisation ou de la déconstruction devrait être fait dans @BeforeClass et @AfterClass en conséquence, ou vous pouvez utiliser @Autowire et laissez-le Printemps de la poignée de l'objet champ d'application.
Une nouvelle suite sera construit pour chaque test. Cela est plus évident dans les JUnit3 où vous avez eu à créer une nouvelle série à l'aide d'un test spécifié nom.
Prendre un coup d'oeil à la JavaDoc:
Votre cas d'utilisation est un peu déroutant depuis votre test n'est pas en train de faire quoi que ce soit et il n'y a pas de fève, qui vous référence. Par défaut, le Printemps haricots sont déclarées avec l'étendue par défaut="singleton" attribut, de sorte que vous avait en fait déclaré un haricot, il aurait été mis en cache singleton. Toutefois, cela n'a rien à voir avec l'exécution de la méthode.
Cela fait un peu plus de sens. Je n'ai pas compris le reste de votre code avant qu'il a été modifié pour inclure la mise en forme. Je suis assez sûr que vous pouvez utiliser lazy-init="true" pour la rendre Printemps instancier à la demande de @BeforeClass ou @Avant à l'aide d'un BeanFactory, mais qui ne résout pas la ré-initialisation. Peut-être que c'est juste mon avis, mais je ne pense pas qu'il y a un problème dans la ré-initialisation de moins qu'il y a un code de contrainte.
Correction à mon commentaire: "@Avant et tels aussi exécuter avant d'injecter" n'est pas vrai. Je ne pense pas que les changements trop avec cette question.
OriginalL'auteur Droo