2013-02-24 116 views
4

我不開心處理與以下把東西在地圖<?,?>或轉換地圖<String,字符串>到地圖<?,?>

public Map<?, ?> getMap(String key); 

我想要編寫單元測試消耗這個定義的接口人接口。

Map<String,String> pageMaps = new HashMap<String,String(); 
pageMaps.put(EmptyResultsHandler.PAGEIDENT,"boogie"); 
pageMaps.put(EmptyResultsHandler.BROWSEPARENTNODEID, "Chompie"); 
Map<?,?> stupid = (Map<?, ?>)pageMaps; 
EasyMock.expect(config.getMap("sillyMap")).andReturn(stupid); 

並且編譯器正在編程。

The method andReturn(Map<capture#5-of ?,capture#6-of ?>) in the type IExpectationSetters<Map<capture#5-of ?,capture#6-of ?>> is not applicable for the arguments (Map<capture#7-of ?,capture#8-of ?>) 

如果我嘗試直接使用pageMaps,它告訴我:

The method andReturn(Map<capture#5-of ?,capture#6-of ?>) in the type IExpectationSetters<Map<capture#5-of ?,capture#6-of ?>> is not applicable for the arguments (Map<String,String>) 

如果我做一個pageMapsMap<?,?>,我不能把字符串這裏面。

The method put(capture#3-of ?, capture#4-of ?) in the type Map<capture#3-of ?,capture#4-of ?> is not applicable for the arguments (String, String) 

我已經看到了一些客戶端代碼,不會醜選中轉換,像

@SuppressWarnings("unchecked") 
     final Map<String, String> emptySearchResultsPageMaps = (Map<String, String>) conf.getMap("emptySearchResultsPage"); 

如何獲得的數據爲Map<?,?>,或將我Map<String,String>Map<?,?>

+0

這裏有一種混淆:你嘗試說服編譯器愚蠢是一個帶有2個類型參數的Map *你不關心*,但是,儘管如此,你仍然使用Map類型的Map 。但是你應該做的是測試這個接口適用於你需要的任何類型的組合。 – Ingo 2013-02-24 10:17:16

+0

如果讓它返回'pageMaps',會發生什麼? 'EasyMock.expect(config.getMap(「sillyMap」))。andReturn(pageMaps);' – 2013-02-24 10:20:21

+0

我只關心它作爲一個Map 來進行這個測試,但這是無關緊要的。如果我無法獲取數據,我不知道如何「測試該接口適用於我需要的任何類型的組合」。如果我使地圖完全通用,put()拒絕工作。 – 2013-02-24 10:23:25

回答

5
  1. 沒有辦法,你可以寫Map<String, String> map = getMap("abc");沒有投
  2. 的問題更多的是與EasyMock的和類型退換/由expectandReturn方法,這我不熟悉的預期。你可以寫

    Map<String, String> expected = new HashMap<String, String>(); 
    Map<?, ?> actual = getMap("someKey"); 
    boolean ok = actual.equals(pageMaps); 
    //or in a junit like syntax 
    assertEquals(expected, actual); 
    

不知道是否可以用嘲弄的東西混合。這也許可以工作:

EasyMock.expect((Map<String, String>) config.getMap("sillyMap")).andReturn(pageMaps); 

另外請注意,你不能添加任何東西到泛型集合的泛型集合。所以這個:

Map<?, ?> map = ... 
map.put(a, b); 

將無法​​編譯,除非ab爲空。

+0

很好地完成了,我沒有想過試圖在預期的調用中投入。 – 2013-02-24 10:31:02

相關問題