2014-01-20 27 views
7

我有一個測試類,看起來像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已經通過並添加了它自己,所以沒有問題),但我不喜歡以前的情況,我想開始每一個沒有預期的測試。

回答

14

這是我的解決方案。我不知道這是否僅限於Spring 3.2,或者它是一個普遍的誤解,但僅僅使用@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)不足以導致整個Spring上下文在每次測試中重新加載。我還必須在@TestExecutionListeners中加上DirtiesContextTestExecutionListener
那麼,到底有什麼工作對我來說只是改變我的TestClass

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {"classpath:/test-context.xml"}) 
@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD) 
@TestExecutionListeners({DirtiesContextTestExecutionListener.class}) 
public abstract class TestClass 

沒有別的改變註解。

+1

假設您有多個測試監聽器存在 - 在這種情況下,它們將覆蓋默認監聽器,包括用於弄髒上下文的監聽器,並免除它們的運行。 可能''@DirtiesContext @TestExecutionListeners(value = {MyListener.class,OtherListener.class},mergeMode = MergeMode.MERGE_WITH_DEFAULTS)''也會這樣做。 – phineas

+0

Yoy拯救了我的一天! –

相關問題