2011-06-24 61 views
1

我不確定如何使用easymock設置這種行爲。爲了說明我創建了一個簡化的例子。 基本上,我有一個方法返回void,並拿一張地圖,我想easymock改變地圖,刪除我指定的條目。easymock設置對模擬對象方法參數的期望

假設我有以下接口:

public interface Filter{ 
    public void filter(Map<String,String>map);  

} 

及以下類:

public class MyClass { 
    private Filter filter; 
    public MyClass(Filter filter) { 
     this.filter = filter; 
    } 
    public Map<String,String> process(Map<String,String>map) { 
     filter.filter(map); 
     return map; 
    } 
} 

我無法弄清楚如何設置此行爲:

public class MyClassTest { 

    /** 
    * Test method for {@link easy.MyClass#process(java.util.Map)}. 
    */ 
    @Test 
    public void testProcess() { 
     Map<String, String> map = new HashMap<String, String>(); 
     map.put("one","AAA"); 
     map.put("remove","BBB"); 
     map.put("three","CCC"); 
     Map<String, String> expectedRet = new HashMap<String, String>(); 
     expectedRet.put("one","AAA"); 
     expectedRet.put("three","CCC"); 


     IMocksControl mockery = EasyMock.createControl(); 
     mockery.resetToStrict(); 
     mockery.checkOrder(true); 

     Filter mockFilter = mockery.createMock("filter", Filter.class); 
     MyClass m = new MyClass(mockFilter); 
     mockFilter.filter(map); 
     // I would like some behaviour that will remove the entry ("remove","BBB") 
     // how can I define that? 

     mockery.replay(); 
     m.process(map);   
     mockery.verify(); 

     assertEquals(expectedRet,map); 

    } 

} 

回答

0

你應設置一個期望m.process(map)將模擬電話filter(map) ed過濾器:

Filter mockFilter = mockery.createMock("filter", Filter.class); 

    // set expectation 
    mockFilter.filter(map); 
    replay(mockFilter); 

    MyClass m = new MyClass(mockFilter); 
    m.process(map); 

    // verify expectation 
    verify(mockFilter); 

您在上面的代碼摘錄中所採用的路徑試圖驗證您的模擬過濾器。這不應該成爲你測試的目標。在你的情況下被測試的班級是MyClass,而不是Filter

更新:您可以添加行爲的模擬:

expect(mockFilter.filter(map)).andDelegateTo(new Filter { 
    @Override 
    void filter(Map<String, String> map) { 
     map.remove("remove"); 
    } 
}); 

然而,在特定情況下的Filter界面十分簡單,導致andDelegateTo擊敗首先使用模擬Filter的目的。用相同數量的代碼,你可以在您的測試用一個具體的實例Filter

class TestFilter implements Filter { 
    @Override 
    void filter(Map<String, String> map) { 
     map.remove("remove"); 
    } 
} 

MyClass m = new MyClass(new TestFilter()); 
m.process(map); 
assertNull(map.get("remove")); 
+0

我不知道我明白你的意思,1- mockFilter沒有一個方法,這個過程被稱爲(地圖),然後2-你在哪裏設置地圖需要被分條的期望。請你澄清一下嗎? – Charbel

+0

@Charbel:(1)我的錯誤。我在設定期望值的同時寫了'process(map)'而不是'filter(map)'。模擬的'Filter'對象將有一個'filter'方法。 (2)就是這樣。您不需要設置過濾器最終會剝離條目的期望。這是另一個測試的關注點,被測試的類是「Filter」。在這個測試中,我們正在測試'MyClass'。理想情況下,測試應該集中在一件事情上。 –

+0

基本上我想測試一下,無論地圖是由過濾器返回的。 MyClass.process不會改變它。 – Charbel

相關問題