无法使用Mockito返回类对象

mw3dktmi  于 2022-12-23  发布在  其他
关注(0)|答案(6)|浏览(185)

我正在尝试编写一个单元测试,为此,我正在为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的问题,还是我做错了什么?

2cmtqfgy

2cmtqfgy1#

另外,一个稍微简洁一点的解决方法是使用do语法代替when。

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

yhived7q2#

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

Mockito.when返回的OngoingStubbing<Class<?>>ongoingStubbing的类型不同,因为每个“?”通配符都可以绑定到不同的类型。
要使类型匹配,需要显式指定type参数:

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

agxfikkp3#

我不知道为什么你会得到这个错误。它一定与返回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;
    }

}
dvtswwa3

dvtswwa34#

您可以简单地从类中删除))

Class userClass = User.class;
when(methodParameter.getParameterType()).thenReturn(userClass);
jyztefdp

jyztefdp5#

我发现这里的代码示例与methodParameter.getParameterType的用法有点混淆()首次用于已接受答案的SandBoxTest中,经过进一步挖掘,我发现another thread pertaining to this issue提供了一个更好的示例,该示例清楚地表明我需要的Mockito调用是doReturn(myExpectedClass).when(myMock).callsMyMethod(withAnyParams).使用该格式允许我模拟类的返回.希望这篇注解能帮助将来搜索类似问题的人.

n8ghc7c1

n8ghc7c16#

另外两种解决方案:
在这里,我们用编译错误换取一个未检查的赋值警告:

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

一个不带警告的更简洁的解决方案是

Class<?> userClass = User.class;
when(methodParameter.getParameterType()).thenAnswer(__ -> userClass);

相关问题