在参数匹配指定泛型类类型

问题描述:

考虑下面的代码:在参数匹配指定泛型类类型

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特定的问题,但我认为我会标记它以吸引那些过去可能遇到此问题的人。

泛型信息在运行时被擦除[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