[java] Wie kann ich veranlassen, dass eine Methode ein Argument zurückgibt, das an sie übergeben wurde?



Answers

Wenn Sie Mockito 1.9.5 oder höher haben, gibt es eine neue statische Methode, die das Answer für Sie erstellen kann. Sie müssen etwas wie schreiben

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

oder alternativ

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

Beachten Sie, dass die Methode returnsFirstArg() in der AdditionalAnswers Klasse statisch ist, was für Mockito 1.9.5 neu ist. Sie benötigen also den richtigen statischen Import.

Question

Betrachten Sie eine Methodensignatur wie:

public String myFunction(String abc);

Kann Mockito die gleiche Zeichenfolge zurückgeben, die die Methode erhalten hat?




Ich benutze etwas ähnliches (im Grunde ist es der gleiche Ansatz). Manchmal ist es nützlich, wenn ein Mock-Objekt eine vordefinierte Ausgabe für bestimmte Eingaben zurückgibt. Das geht so:

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



Ich hatte ein sehr ähnliches Problem. Das Ziel war, einen Dienst zu verspotten, der Objekte beharrt und sie mit ihrem Namen zurückgeben kann. Der Service sieht so aus:

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

Der Service-Mock verwendet eine Karte zum Speichern der Room-Instanzen.

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

Wir können jetzt unsere Tests mit diesem Mock durchführen. Beispielsweise:

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



Links



Tags

java java   mockito