[java] मैं एक विधि को एक तर्क कैसे वापस कर सकता हूं जो इसे पारित किया गया था?


Answers

यदि आपके पास मॉकिटो 1.9.5 या उच्चतर है, तो एक नई स्थैतिक विधि है जो आपके लिए Answer वस्तु बना सकती है। आपको कुछ लिखना होगा

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

या वैकल्पिक रूप से

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

ध्यान दें कि returnsFirstArg() विधि AdditionalAnswers क्लास में स्थिर है, जो मॉकिटो 1.9.5 के लिए नया है; तो आपको सही स्थिर आयात की आवश्यकता होगी।

Question

एक विधि हस्ताक्षर पर विचार करें जैसे:

public String myFunction(String abc);

क्या मॉकिटो उसी स्ट्रिंग को वापस करने में मदद कर सकता है जिस विधि को प्राप्त हुआ?




मैं कुछ इसी तरह का उपयोग करता हूं (मूल रूप से यह वही दृष्टिकोण है)। कभी-कभी कुछ इनपुट के लिए नकली ऑब्जेक्ट रिटर्न प्री-डिफ़ाइंड आउटपुट होना उपयोगी होता है। यह इस तरह से चला जाता है:

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



मुझे एक बहुत ही समस्या थी। लक्ष्य एक ऐसी सेवा का नकल करना था जो वस्तुओं को जारी रखता है और उन्हें उनके नाम से वापस कर सकता है। सेवा इस तरह दिखती है:

public class RoomService {
    public Room findByName(String roomName) {...}
    public void persist(Room 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;
    }
});

अब हम इस नकली पर अपने परीक्षण चला सकते हैं। उदाहरण के लिए:

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



Related



Tags

java java   mockito