Вопрос по mocking, generics, mockito, class, java – Использование:

40

твует универсальный метод, который принимает класс в качестве параметра, и у меня возникают проблемы с его заменой на 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   ответа
0

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

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

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

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();
75

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

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.

Могучий благодарен! Joseph Lust
работал как шарм, очень хороший ответ. Хорошо объяснил тоже Peter Perháč
На самом деле. Но мне интересно, можно ли улучшить Mockito, чтобы пользователи могли «сочетать сопоставители аргументов и реальные аргументы»; если Unitils Mock может это сделать, то это должно быть технически возможно. Rogério

Похожие вопросы