用Mockito作为参数来保存Class <T>的方法

有一个通用的方法需要一个类作为参数,我有问题与Mockito存根问题。 该方法如下所示:

public <U extends Enum<U> & Error, T extends ServiceResponse<U>> T validate( Object target, Validator validator, Class<T> responseClass, Class<U> errorEnum); 

至less对我来说,这太神奇了…我可以想象没有它的生活,但是其他的代码库很高兴地使用它…

我打算在unit testing中存根这个方法返回一个新的空对象。 但是我怎么用mockito来做这个? 我试过了:

 when(serviceValidatorStub.validate( any(), isA(UserCommentRequestValidator.class), UserCommentResponse.class, UserCommentError.class) ).thenReturn(new UserCommentResponse()); 

但由于我混合和匹配匹配器和原始值,我得到“org.mockito.exceptions.misusing.InvalidUseOfMatchersException:无效的参数匹配使用!”

问题是,你不能在一个模拟的调用中混合参数匹配器和真实的参数。 所以,而是这样做:

 when(serviceValidatorStub.validate( any(), isA(UserCommentRequestValidator.class), eq(UserCommentResponse.class), eq(UserCommentError.class)) ).thenReturn(new UserCommentResponse()); 

注意使用eq()参数匹配器匹配相等。

请参阅: https : //static.javadoc.io/org.mockito/mockito-core/1.10.19/org/mockito/Matchers.html#eq(T)

另外,您可以对Class<?>types使用same()参数匹配器 – 它匹配相同的标识,如== Java运算符。

只是为了在同一个线程上完成,如果有人想要用一个类作为参数来存根的方法,但是不关心types,或者需要用同样的方法来存储多个types,下面是另一个解决scheme:

 private class AnyClassMatcher extends ArgumentMatcher<Class<?>> { @Override public boolean matches(final Object argument) { // We always return true, because we want to acknowledge all class types return true; } } private Class<?> anyClass() { return Mockito.argThat(new AnyClassMatcher()); } 

然后打电话

 Mockito.when(mock.doIt(this.anyClass())).thenCallRealMethod(); 

很好的@Ash。 我用你的通用类匹配器在下面做准备。 如果我们想要准备一个特定types的模拟,可以使用这个(不是实例)

 private Class<StreamSource> streamSourceClass() { return Mockito.argThat(new ArgumentMatcher<Class<StreamSource>>() { @Override public boolean matches(Object argument) { // TODO Auto-generated method stub return false; } }); } 

用法:

  Mockito.when(restTemplate.getForObject(Mockito.anyString(), **streamSourceClass(),** Mockito.anyObject));