我已經分配了將我們的模擬代碼從EasyMock 1樣式升級到EasyMock 2/3樣式的任務(這是關於時間的,給定的EasyMock 1的大部分在2005年被棄用,並在2010年被刪除,但我們仍然在2014年使用它!)。將多參數匹配()從EasyMock 1 ArgumentsMatcher轉換爲EasyMock 2/3 IArgumentMatcher
我已經想通了如何升級大部分事情,但我有很多的麻煩在轉換實施ArgumentsMatcher
匹配器(稱爲EasyMock的1.0.1,其中我們用的是ParameterMatcher
)一類實施IArgumentMatcher
。
在EasyMock的1的ArgumentsMatcher
,用於匹配)方法的簽名(狀態:
matches(Object[] expected, Object[] actual)
但在EasyMock的用於匹配方法的簽名()三分之二的IArgumentMatcher
是:
matches(Object argument)
我從教程中發現一個IArgumentsMatcher
,你可以通過將期望的參數移動到構造函數中來轉換匹配器,lik e所以:
public class GenericMatcher implements IArgumentMatcher {
private Object expected;
public GenericMatcher(Object expected) {
this.expected = expected;
}
public boolean matches(Object actual) {
return this.expected.equals(actual); //Or some other comparison
}
}
這工作正常,但只有當數組傳入包含一個元素。我在代碼中有許多匹配器,它們一次匹配多個元素。例如:
public boolean matches(Object[] expected, Object[] actual) {
if (expected[0].equals(actual[0]){
return expected[1].getName().equals(actual[1]).getName());
}
else {
return false;
}
}
我不知道如何將其轉換爲IArgumentMatcher
。雖然我可以在構造函數中放入多個參數,但IArgumentMatcher
接口只聲明match()方法有一個參數,因此我無法進行多重比較。
當然,我繼承的代碼沒有文檔,不幸的是EasyMock文檔似乎有點缺乏實際傳遞到任一版本的匹配方法的內容。那麼,我將如何轉換這個匹配器?
你沒有理由把你傳入的對象作爲'expected'不能是一個數組,雖然在那裏?查看EasyMocks對'ArrayEquals'的實現(在'EasyMock.aryEq()'matcher中使用)可能對此有所幫助。或者,甚至更好,你能用'EasyMock.aryEq()'匹配器來替換你匹配器的所有實例嗎? –
@DanTemple,啊,所以它似乎是我的問題的第一部分是我忘記了一個數組可以作爲一個對象傳入(我以爲它算作一種基本類型)。不過,我不認爲數組通常會傳入'IArgumentMatcher' matches()方法。不幸的是,真正的代碼更復雜,'EasyMock.aryEq()'不足以滿足我需要,因爲一些數組值比較不同。 – Thunderforge
你可能對沒有傳遞給'matches()'方法的數組是正確的。根據'ArrayEquals'中重寫的'matches'方法的外觀,'instanceof'屬性也被檢查用於所有基元數組類型和Object數組。如果符合'instanceof'檢查,則它將使用java utils中的'Arrays.equals()'。如果'instanceof'檢查不符合,它會調用剛剛使用對象相等的super'matches'方法。最終,這聽起來像你正在編寫你自己的匹配器,'ArrayEquals'可能會幫助給出如何去做的想法。 –