2012-02-13 102 views
2

考慮下面的代碼:在參數匹配指定泛型類類型

final Foo foo = context.mock(Foo.class); 

context.checking(new Expectations() {{ 
    one(foo).someMethod(with(aNonNull(List.class))); 
}}); 

我試圖表明,someMethod被調用,List<Bar>類型的非空參數。但是,我找不出正確的語法來指定該列表包含Bar類型的對象。下面簡單的嘗試是無效代碼:

final Foo foo = context.mock(Foo.class); 

context.checking(new Expectations() {{ 
    one(foo).someMethod(with(aNonNull(List<Bar>.class))); 
}}); 

有沒有做到這一點還是我不得不添加@SuppressWarnings("unchecked")到我的測試方法的正確方法是什麼?

我很欣賞這不是嚴格的JMock特定的問題,但我認爲我會標記它以吸引那些過去可能遇到此問題的人。

回答

2

泛型信息在運行時被擦除[JB] Effective Java SE p.l14。 所以你必須另外檢查一下。

我發現這個方法來檢查列表的所有元素的類型:

final Foo foo = context.mock(Foo.class); 

context.checking(new Expectations() {{ 
    oneOf(foo).someMethod((List<Object>) with(Every.everyItem(IsInstanceOf.instanceOf(Bar.class)))); 
}}); 
+0

這解釋了根本原因並從而吸引獎金。我會感謝來自這種情況的任何人的進一步評論,他們可能有不同的方式來處理這個問題。 – 2012-02-13 16:18:59

+0

也許你可以編寫你自己的Hamcrest匹配器 - 在List.Class和Bar.class中傳遞,並匹配你的自我 – blank 2012-02-13 16:36:08