2017-01-13 6 views
0

So verwende ich doAnswer() API eine Methode setProperty (String, String) der Klasse NodeApportieren verspottet Objektnamen in Mockito in

Node attachmentsJcr = mock(Node.class);   
doAnswer(AnswerImpl.getAnswerImpl()).when(attachmentsJcr).setProperty(anyString(),anyString()); 

AnswerImpl unten-

public class AnswerImpl implements Answer{ 

    private static AnswerImpl instance; 

    private AnswerImpl(){ 
    } 

    public static AnswerImpl getAnswerImpl(){ 
     if(instance == null){ 
      instance = new AnswerImpl(); 
      return instance; 
     } 
     else 
      return instance; 
    } 

    @Override 
    public Object answer(InvocationOnMock invocationOnMock) throws Throwable { 

     final String key = (String)(invocationOnMock.getArguments())[0]; 
     final String value = (String)(invocationOnMock.getArguments())[1]; 
     final String mockedObjectName = ? 
     results.put(key,value); // results here is a hashhmap 
     return mockedObjectName; 
    } 
} 
implementiert zu verspotten

Ich konnte die Argumente abrufen, die an die setProperty-Methode übergeben wurden. Aber ich kann den MockedObjectName ("AttachmentsJcr" in diesem Fall) nicht abrufen.

Antwort

1

Gespiegelte Objekte haben keine "Namen". Der einzige Grund für das Vorhandensein eines Scheinobjekts besteht darin, Ihnen zu ermöglichen, das Verhalten, das der getestete Code bei der Interaktion mit Mock-Objekten "sieht", zu Steuerelement.

Mit anderen Worten:

Node attachmentsJcr = mock(Node.class); 

tut nicht ein "echtes" Node-Objekt erstellen. Ja, attachmentsJcr ist eine Referenz auf ein Node-Objekt. aber dieses Objekt wurde "magisch" vom spöttischen Rahmen geschaffen. Es hat nicht die "echten" Eigenschaften eines Node-Objekts. Sie können nur die Methoden aufrufen, die ein Node-Objekt bieten würde.

In diesem Sinne: Wenn Ihre Node-Klasse eine Methode wie getName() ... hat, dann ist der zurückgegebene Name einfach das, was Sie zum Nachgeben auf Aufrufe von getName() konfiguriert haben.

Und nur um sicher zu sein: AnswerImpl ist nicht "Produktionscode", oder?

+0

Dank Ghost .... Ich denke, ich kann die Mock-Objekte konfigurieren, um einen bestimmten Namen zurückzugeben, wenn getName() aufgerufen wird. Das sollte für mich funktionieren. Und nein, es ist kein Produktionscode. Ich habe nur mit Mockito gespielt, um mich zu lernen :) – Tapan