使用Mockito将Class <T>作为参数的方法存根

Pet*_*háč 44 java generics class mocking mockito

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

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

这真是可怕,至少对我而言......我可以想象没有它的生活,但代码库的其余部分愉快地使用它......

在我的单元测试中,我打算将此方法存根以返回一个新的空对象.但是我如何用mockito做到这一点?我试过了:

when(serviceValidatorStub.validate(
    any(), 
    isA(UserCommentRequestValidator.class), 
    UserCommentResponse.class, 
    UserCommentError.class)
).thenReturn(new UserCommentResponse());
Run Code Online (Sandbox Code Playgroud)

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

Jes*_*sse 82

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

when(serviceValidatorStub.validate(
    any(),
    isA(UserCommentRequestValidator.class),
    eq(UserCommentResponse.class),
    eq(UserCommentError.class))
).thenReturn(new UserCommentResponse());
Run Code Online (Sandbox Code Playgroud)

注意使用eq()参数匹配器来匹配相等性.

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

此外,您可以使用same()参数匹配器作为Class<?>类型 - 这匹配相同的标识,如==Java运算符.