我有一個測試類,看起來像Spring @DirtiesContext是否重新加載Spring上下文?
@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
}
}
和test-context.xml
我通過factory-method
定義JUnitRuleMockery
加上幾個模擬對象,像
<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
是
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
}
在TestClass
我有幾種測試方法,並且由於註釋@DirtiesContext
,我期待在每次測試執行後都會重新加載Spring上下文(因爲每個測試都會在模擬對象上設置期望值,所以每次都必須重新加載Spring上下文)。見@DirtiesContext from here。然而,看起來Spring的上下文沒有被重載:事實上,在test2
(假設test1
之前已經執行)開始進入調試模式,我可以看到jMockContext
仍然持有來自test1
的期望值,執行列表和錯誤(如果有的話) 。
因此,最終只有幾個問題,@DirtiesContext
確實會導致Spring上下文重新加載(正如我從Spring Docs中瞭解的),還是我誤解了註釋?在第一種情況下,我做錯了什麼?在後一種情況下,我如何強制每次測試重新加載Spring上下文?
編輯,來界定問題:我有一個類似於上面幾天運行的代碼的代碼,然後今天我創建了一個新的測試,我添加了一個失敗的期望。然後,我看到班上所有其他的考試都因爲同樣的原因而失敗(而他們在直到今天)。調試,我發現jMockContext
從來沒有被清除,這意味着所有的測試都增加了對同一個池的期望:當然,只要沒有期望失敗,這是透明的,我沒有注意到它(test1
增加並通過了很少的期望, test2
需要一個非空的期望庫,ALREADY已經通過並添加了它自己,所以沒有問題),但我不喜歡以前的情況,我想開始每一個沒有預期的測試。
假設您有多個測試監聽器存在 - 在這種情況下,它們將覆蓋默認監聽器,包括用於弄髒上下文的監聽器,並免除它們的運行。 可能''@DirtiesContext @TestExecutionListeners(value = {MyListener.class,OtherListener.class},mergeMode = MergeMode.MERGE_WITH_DEFAULTS)''也會這樣做。 – phineas
Yoy拯救了我的一天! –