SpringJUnit4ClassRunner initialize haricots pour chaque test?
-
21-09-2019 - |
Question
Le test suivant montre que ce grain de test est initialisé deux fois au printemps. J'espère que quelqu'un peut me dire pourquoi il en est ainsi, car il ne devrait être qu'une seule 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 le fichier de haricot:
<?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 est ici la sortie:
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
La solution
Il est pas une convention de printemps. Vous devriez suivre les conventions JUnit, à savoir l'initialisation suite à l'échelle ou la déconstruction devrait se faire dans @BeforeClass et @AfterClass en conséquence, ou vous pouvez utiliser @Autowire et laissez ressort gérer la portée de l'objet.
Une nouvelle suite sera construite pour chaque test. Ceci est plus apparent dans JUnit3 où vous deviez créer une nouvelle suite en utilisant un nom de test spécifié.
Jetez un oeil à la JavaDoc :
L'annotation de test indique que JUnit la méthode public void auquel il est ci-joint peut être exécuté en cas de test. Pour exécuter la méthode, JUnit premières constructions une nouvelle instance de la classe alors appelle la méthode annotée. Tous exceptions lancées par l'épreuve seront rapporté par JUnit comme un échec. Sinon des exceptions sont levées, le test est supposés avoir réussi.
Votre cas d'utilisation est un peu déroutante car votre test ne fait quoi que ce soit et il n'y a pas de haricots, que vous faites référence. Par défaut, les haricots de printemps sont déclarées par le champ par défaut d'attribut = « singleton », de sorte que vous aviez effectivement déclaré un haricot, il aurait été un singleton mises en cache. Cependant, cela n'a rien à voir avec l'exécution de la méthode.