SpringJUnit4ClassRunner initialisieren Bohnen für jeden Test?
-
21-09-2019 - |
Frage
Der folgende Test zeigt, dass dieser Test bean zweimal von Spring initialisiert wird. Ich hoffe jemand kann mir sagen, warum das so ist, da es nur einmal sein sollte. Hier ist der 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
Hier ist die Bean-Datei:
<?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>
und hier ist die Ausgabe:
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
Lösung
Es ist kein Frühling Konvention. Sie sollten folgende JUnit Konventionen werden, das heißt Suite weite Initialisierung oder Rückbau sollte entsprechend in @BeforeClass und @AfterClass getan werden, oder Sie können @Autowire verwenden und lassen den Frühling Anwendungsbereich des Objekts behandeln.
Eine neue Suite wird für jeden Test konstruiert werden. Dies ist deutlicher in JUnit3, wo Sie eine neue Suite mit einem spezifizierten Testnamen erstellen hatte.
Werfen Sie einen Blick auf die JavaDoc :
Die Test-Anmerkung sagt JUnit, dass die public void Methode, auf die es gebunden ist, kann als Testfall ausgeführt werden. führt das Verfahren, JUnit erste Konstrukte eine neue Instanz der Klasse dann ruft die kommentierten Methode. Alle Ausnahmen durch den Test geworfen werden von JUnit als Ausfall gemeldet. wenn nein Ausnahmen geworfen werden, ist der Test angenommen zu haben, zu erfolgreich ist.
Ihr Anwendungsfall ist ein bisschen verwirrend, da Ihr Test nicht tatsächlich etwas zu tun, und es gibt keine Bohne, die Sie verweisen. Standardmäßig wird die Spring-Beans mit dem Standardbereich deklariert = „Singletons“ -Attribut, so hatte man eigentlich eine Bohne erklärt, es wäre ein zwischengespeichert Singleton gewesen. Dies hat jedoch nichts mit der Methode der Ausführung zu tun.