web-dev-qa-db-fra.com

Impossible de retourner un objet de classe avec Mockito

J'essaie d'écrire un test unitaire et, pour ce faire, j'écris une déclaration when pour un simulacre Mockito, mais je n'arrive pas à obtenir qu'Eclipse reconnaisse que ma valeur de retour est valide.

Voici ce que je fais:

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

Le type de retour de .getParameterType() est Class<?>. Je ne comprends donc pas pourquoi Eclipse dit: 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 ?>). Il propose de lancer mon userClass, mais cela ne fait que créer des éléments confus, Eclipse dit qu’il a besoin de lancer à nouveau (et ne peut pas lancer).

Est-ce juste un problème avec Eclipse, ou est-ce que je fais quelque chose de mal?

25
CorayThan

En outre, un moyen un peu plus concis de contourner ce problème consiste à utiliser la syntaxe do à la place de when.

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

Le OngoingStubbing<Class<?>> renvoyé par Mockito.when n'est pas du même type que ongoingStubbing car chaque '?' le caractère générique peut être lié à un type différent.

Pour que les types correspondent, vous devez spécifier explicitement le paramètre type:

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

Je ne sais pas pourquoi vous obtenez cette erreur. Il doit y avoir quelque chose de spécial à faire avec le renvoi de Class<?>. Votre code compile bien si vous renvoyez Class. Ceci est une simulation de ce que vous faites et ce test réussit. Je pense que cela fonctionnera pour vous aussi:

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;
    }


}
11
Daniel Kaplan

J'ai trouvé les exemples de code ici un peu déroutants avec l'utilisation de methodParameter.getParameterType () d'abord utilisé dans SandBoxTest de la réponse acceptée. Après avoir creusé un peu plus, j'ai trouvé un autre sujet relatif à ce problème qui fournissait un meilleur exemple. Cet exemple indiquait clairement que l'appel Mockito dont j'avais besoin était doReturn (myExpectedClass) .when (myMock) .callsMyMethod (withAnyParams). L'utilisation de ce formulaire me permet de simuler un retour de classe. Espérons que cette note aidera quelqu'un à la recherche d'un problème similaire à l'avenir.

1
noisiveRevision

Vous pouvez simplement retirer de la classe))

Class userClass = User.class;
when(methodParameter.getParameterType()).thenReturn(userClass);
1
Dennis Glot