Не удается вернуть объект класса с помощью 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, или я делаю что-то неправильно?
Ответы
Ответ 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). Использование этой формы позволяет мне высмеять возврат класса. Надеюсь, эта заметка поможет кому-то найти подобную проблему в будущем.