Подтвердить что ты не робот

Не удается вернуть объект класса с помощью Mockito

Я пытаюсь написать unit test, и для этого я пишу инструкцию when для макета Mockito, но я не могу заставить eclipse распознать, что мое возвращаемое значение действительно.

Вот что я делаю:

Class<?> userClass = User.class;
when(methodParameter.getParameterType()).thenReturn(userClass);

Тип возврата .getParameterType() равен Class<?>, поэтому я не понимаю, почему eclipse говорит, The method thenReturn(Class<capture#1-of ?>) in the type OngoingStubbing<Class<capture#1-of ?>> is not applicable for the arguments (Class<capture#2-of ?>). Он предлагает лить мой userClass, но это просто делает некоторые искаженные вещи, затмение говорит, что нужно снова бросать (и не может делать).

Это просто проблема с Eclipse, или я делаю что-то неправильно?

4b9b3361

Ответ 1

Я не уверен, почему вы получаете эту ошибку. Он должен иметь что-то особенное с возвращением Class<?>. Ваш код компилируется, если вы вернетесь Class. Это симуляция того, что вы делаете, и этот тест проходит. Я думаю, это тоже сработает для вас:

package com.sandbox;

import org.junit.Test;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;

import static org.mockito.Mockito.*;

import static junit.framework.Assert.assertEquals;

public class SandboxTest {

    @Test
    public void testQuestionInput() {
        SandboxTest methodParameter = mock(SandboxTest.class);
        final Class<?> userClass = String.class;
        when(methodParameter.getParameterType()).thenAnswer(new Answer<Object>() {
            @Override
            public Object answer(InvocationOnMock invocationOnMock) throws Throwable {
                return userClass;
            }
        });

        assertEquals(String.class, methodParameter.getParameterType());
    }

    public Class<?> getParameterType() {
        return null;
    }


}

Ответ 2

Кроме того, немного более простой способ обойти это - использовать синтаксис do вместо того, чтобы.

doReturn(User.class).when(methodParameter).getParameterType();

Ответ 3

Class<?> userClass = User.class;
OngoingStubbing<Class<?>> ongoingStubbing = Mockito.when(methodParameter.getParameterType());
ongoingStubbing.thenReturn(userClass);

OngoingStubbing<Class<?>>, возвращаемый Mockito.when, не является тем же типом, что и ongoingStubbing, потому что каждый '?' подстановочный знак может быть привязан к другому типу.

Чтобы совместить типы, вам нужно явно указать параметр типа:

Class<?> userClass = User.class;
Mockito.<Class<?>>when(methodParameter.getParameterType()).thenReturn(userClass);

Ответ 4

Я нашел примеры кода здесь немного запутанными с использованием методаParameter.getParameterType(), который сначала используется в принятом ответе SandBoxTest. После того, как я немного поработал, я нашел другой поток, относящийся к этой проблеме, который показал лучший пример. В этом примере выяснилось, что вызов Mockito, в котором я нуждался, был doReturn (myExpectedClass).when(myMock).callsMyMethod(withAnyParams). Использование этой формы позволяет мне высмеять возврат класса. Надеюсь, эта заметка поможет кому-то найти подобную проблему в будущем.