我正在尝试编写一个单元测试,为此我正在为Mockito模拟编写一个when语句,但我似乎无法通过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说它需要再次施放(并且不能施放)。
这只是Eclipse的一个问题,还是我做错了什么?
答案 0 :(得分:61)
另外,稍微简洁一点的方法是使用do语法而不是when。
doReturn(User.class).when(methodParameter).getParameterType();
答案 1 :(得分:25)
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);
答案 2 :(得分:12)
我不确定你为什么会收到这个错误。它必须与返回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;
}
}
答案 3 :(得分:1)
我发现这里的代码示例与使用在接受的答案的SandBoxTest中首次使用的methodParameter.getParameterType()有点混淆。在我做了一点挖掘后,我发现another thread pertaining to this issue提供了一个更好的例子。这个例子清楚地说明了我需要的Mockito调用是doReturn(myExpectedClass).when(myMock).callsMyMethod(withAnyParams)。使用该表单允许我模拟Class的返回。希望这篇文章能够帮助将来搜索类似问题的人。
答案 4 :(得分:1)
您可以简单地从课程中删除))
Class userClass = User.class;
when(methodParameter.getParameterType()).thenReturn(userClass);