Заглушка метода, который принимает класс <T>в качестве параметра с Mockito - PullRequest
43 голосов
/ 28 марта 2011

Существует универсальный метод, который принимает класс в качестве параметра, и у меня возникают проблемы с его заменой на Mockito.Метод выглядит следующим образом:

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

Это ужасно, по крайней мере для меня ... Я мог бы представить себе жизнь без него, но остальная часть кодовой базы с радостью использует его ...

В своем модульном тесте я собирался заглушить этот метод для возврата нового пустого объекта.Но как мне сделать это с мокито?Я попытался:

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

, но так как я смешиваю и сопоставляю сопоставления и необработанные значения, я получаю "org.mockito.exceptions.misusing.InvalidUseOfMatchersException: недопустимое использование сопоставителей аргументов!"

Ответы [ 3 ]

80 голосов
/ 28 марта 2011

Проблема в том, что вы не можете смешивать сопоставления аргументов и реальные аргументы в симулированном вызове. Итак, лучше сделайте это:

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)

Кроме того, вы можете использовать same() средство сопоставления аргументов для типов Class<?> - это соответствует той же идентичности, что и оператор == Java.

2 голосов
/ 08 января 2014

Просто для того, чтобы завершить в том же потоке, если кто-то хочет заглушить метод, который принимает класс в качестве аргумента, но не заботится о типе, или нужно, чтобы многие типы были заглушены таким же образом, вот еще одинрешение:

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();
0 голосов
/ 10 июля 2015

Хороший @ Аш.Я использовал ваш общий класс соответствия, чтобы подготовиться ниже.Это может быть использовано, если мы хотим подготовить макет определенного типа. (Не экземпляр)

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));
...