[Java] Comment puis-je rendre une méthode retourne un argument qui lui a été passé?


Answers

Si vous avez Mockito 1.9.5 ou supérieur, il existe une nouvelle méthode statique qui peut rendre l'objet Answer pour vous. Vous devez écrire quelque chose comme

when(myMock.myFunction(anyString())).then(returnsFirstArg());

Ou bien

doAnswer(returnsFirstArg()).when(myMock).myFunction(anyString());

Notez que la méthode returnsFirstArg() est statique dans la classe AdditionalAnswers , qui est nouvelle dans Mockito 1.9.5; Vous aurez donc besoin de la bonne importation statique.

Question

Considérez une signature de méthode comme:

public String myFunction(String abc);

Est-ce que Mockito peut aider à retourner la même chaîne que la méthode reçue?




J'ai eu un problème très similaire. L'objectif était de se moquer d'un service qui persiste sur les Objets et de pouvoir les renvoyer par leur nom. Le service ressemble à ceci:

public class RoomService {
    public Room findByName(String roomName) {...}
    public void persist(Room room) {...}
}

Le simulateur de service utilise une carte pour stocker les instances Room.

RoomService roomService = mock(RoomService.class);
final Map<String, Room> roomMap = new HashMap<String, Room>();

// mock for method persist
doAnswer(new Answer<Void>() {
    @Override
    public Void answer(InvocationOnMock invocation) throws Throwable {
        Object[] arguments = invocation.getArguments();
        if (arguments != null && arguments.length > 0 && arguments[0] != null) {
            Room room = (Room) arguments[0];
            roomMap.put(room.getName(), room);
        }
        return null;
    }
}).when(roomService).persist(any(Room.class));

// mock for method findByName
when(roomService.findByName(anyString())).thenAnswer(new Answer<Room>() {
    @Override
    public Room answer(InvocationOnMock invocation) throws Throwable {
        Object[] arguments = invocation.getArguments();
        if (arguments != null && arguments.length > 0 && arguments[0] != null) {
            String key = (String) arguments[0];
            if (roomMap.containsKey(key)) {
                return roomMap.get(key);
            }
        }
        return null;
    }
});

Nous pouvons maintenant faire nos tests sur ce simulacre. Par exemple:

String name = "room";
Room room = new Room(name);
roomService.persist(room);
assertThat(roomService.findByName(name), equalTo(room));
assertNull(roomService.findByName("none"));



J'utilise quelque chose de similaire (fondamentalement c'est la même approche). Parfois, il est utile d'avoir un objet simulé qui retourne une sortie prédéfinie pour certaines entrées. Cela va comme ceci:

private Hashtable<InputObject,  OutputObject> table = new Hashtable<InputObject, OutputObject>();
table.put(input1, ouput1);
table.put(input2, ouput2);

...

when(mockObject.method(any(InputObject.class))).thenAnswer(
       new Answer<OutputObject>()
       {
           @Override
           public OutputObject answer(final InvocationOnMock invocation) throws Throwable
           {
               InputObject input = (InputObject) invocation.getArguments()[0];
               if (table.containsKey(input))
               {
                   return table.get(input);
               }
               else
               {
                   return null; // alternatively, you could throw an exception
               }
           }
       }
       );