2013-02-28 77 views
9

也許這是一個新手問題,但找不到答案。Mockito:以複雜對象作爲參數的存根方法

我需要用Mockito存根方法。如果方法有「簡單」的參數,那麼我可以做到。例如,具有兩個參數(汽車顏色和門數)的查找方法:

when(carFinderMock.find(eq(Color.RED),anyInt())).thenReturn(Car1); 
when(carFinderMock.find(eq(Color.BLUE),anyInt())).thenReturn(Car2); 
when(carFinderMock.find(eq(Color.GREEN), eq(5))).thenReturn(Car3); 

問題是find參數是一個複雜的對象。

mappingFilter = new MappingFilter(); 
mappingFilter.setColor(eq(Color.RED)); 
mappingFilter.setDoorNumber(anyInt()); 
when(carFinderMock.find(mappingFilter)).thenReturn(Car1); 

此代碼無效。錯誤是「無效使用參數匹配器!1個匹配器預期,2個記錄」。

無法修改「查找」方法,它需要是一個MappingFilter參數。

我想我必須做些什麼來指示Mockito,當mappingFilter.getColor是RED,並且mappingFilter.getDoorNumber是任何的,那麼它必須返回Car1(並且對於另外兩個句子也是一樣的)。 但是如何?

回答

10

使用Hamcrest匹配,如the documentation所示:

when(carFinderMock.find(argThat(isRed()))).thenReturn(car1); 

其中isRed()定義爲

private Matcher<MappingFilter> isRed() { 
    return new BaseMatcher<MappingFilter>() { 
     // TODO implement abstract methods. matches() should check that the filter is RED. 
    } 
} 
+0

非常好,完美的作品:D – 2013-02-28 16:54:20

1

您需要正確執行equals()方法MappingFilter。在等於()你應該只比較顏色而不是門號

在最簡單的形式,它應該是這樣的 -

@Override 
public boolean equals(Object obj) { 
    MappingFilter other = (MappingFilter) obj; 
    return other.getColor() == this.getColor(); 
} 

此外,你應該成爲你的MappingFilter如下簡單的,而不是使用任何匹配,如EQ

mappingFilter = new MappingFilter(); 
mappingFilter.setColor(Color.RED); 
mappingFilter.setDoorNumber(10); //Any integer 
+0

感謝您的回答! 是否可以在不執行equals方法的情況下執行?例如,過濾器有20個字段,我只想測試何時顏色和門號碼具有指定的值,並且在另一段代碼中,當顏色和汽車類型具有指定的值(沒有比較門號)時,等等 – 2013-02-28 16:30:57

+0

好吧,或者,正如@JB Nizet指出的那樣,似乎是這樣做的方式。 – Gopi 2013-02-28 16:35:54

相關問題