Tut Spring @DirtiesContext neu laden Spring-Kontext?
Habe ich eine test-Klasse, die sieht aus wie
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:/test-context.xml"})
@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)
public abstract class TestClass {
@Rule @Resource public JUnitRuleMockery jMockContext;
public void test1() {
//Expectations and test
}
public void test2() {
//Expectations and test
}
}
und in test-context.xml
definiere ich das JUnitRuleMockery
plus mehrere mock-Objekte durch eine factory-method
wie
<bean id="mockContextFactory" class="MockContextFactory" />
<bean id="jMockContext" factory-bean="mockContextFactory" factory-method="getContext" scope="prototype" />
<bean id="firstMock" factory-bean="mockContextFactory" factory-method="getFirstMock" />
<bean id="secondMock" factory-bean="mockContextFactory" factory-method="getSecondMock" />
MockContextFactory
ist
public class MockContextFactory
{
private JUnitRuleMockery jUnitRuleMockery;
public MockContextFactory() {
jUnitRuleMockery = new JUnitRuleMockery();
jUnitRuleMockery.setThreadingPolicy(new Synchroniser());
}
public JUnitRuleMockery getContext() {
return jUnitRuleMockery;
}
public FirstMock getFirstMock() {
return jUnitRuleMockery.mock(FirstMock.class);
}
//others getter
}
In TestClass
ich habe mehrere test-Methoden und aufgrund der Anmerkungen @DirtiesContext
ich erwarte den Frühling Kontext neu geladen werden nach jedem test in der Ausführung (da jeder test setzt die Erwartungen an das mock-Objekte, ich habe die reload-Spring-Kontext jedes mal). Sehen @DirtiesContext von hier. Es scheint jedoch, dass die Spring-Kontext ist nicht neu geladen wird: in der Tat, die Eingabe in den debug-Modus am Anfang test2
(angeblich test1
ausgeführt wurde früher) ich kann sehen jMockContext
Sie noch die Erwartungen, die Ausführung der Liste und Fehler (falls vorhanden) von test1
.
So, zu Ende mit einigen Fragen, tut @DirtiesContext
wirklich Ursache Frühjahr Kontext neu geladen werden soll (wie ich verstanden habe vom Frühjahr Docs) oder habe ich da was missverstehen die annotation? Im ersten Fall, was mache ich falsch? Im letzteren Fall ist, wie kann ich erzwingen, Spring-Kontext geladen werden für jeden test?
BEARBEITEN, begrenzen das problem: ich hatte einen code, wie im Beispiel oben läuft von paar Tage, dann habe ich heute erstellt einen neuen test, bei dem ich fügte hinzu, eine Erwartung, die fehlgeschlagen. Dann sah ich alle anderen Prüfungen in der Klasse scheitern aus dem gleichen Grund (während Sie, wo green
bis heute). Debugging fand ich heraus, dass jMockContext
wurde nie geklärt, was bedeutet, dass alle tests wurden zusätzlich die Erwartungen an die selben pool: natürlich, solange keine Erwartung gescheitert, das war transparent und ich habe es nicht bemerkt (test1
fügt und übergibt wenige Erwartungen, test2
nimmt einen nicht-leeren pool von Erwartungen BEREITS überschritten und fügt seine eigenen so war es kein problem), aber ich weiß nicht, wie die früheren situation, und ich möchte zu Beginn der einzelnen Prüfung ohne vorherigen Erwartungen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist meine Lösung. Ich weiß nicht, ob das begrenzt ist auf das Frühjahr 3.2 oder, wenn es ist ein Allgemeines Missverständnis, sondern einfach mit
@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)
ist nicht genug, um die Ursache für den ganzen Frühling Kontext neu geladen werden für jeden test. Ich hatte, um auch dieDirtiesContextTestExecutionListener
im@TestExecutionListeners
.Also, am Ende, was für mich gearbeitet wurde nur zum ändern der annotation von meinem
TestClass
zuNichts ändern.
@DirtiesContext @TestExecutionListeners(value = {MyListener.class, OtherListener.class}, mergeMode = MergeMode.MERGE_WITH_DEFAULTS)
wird es auch tun.