2016-12-12 4 views
1

Ich arbeite an einem J2EE-Projekt, das die JIRA's REST Client verwendet. Dieser Client gibt ein Jira issue Objekt zurück. Einige der Felder der Issue Klasse sind key, self, id, summary, etc etc. Das self Feld hier im Grunde eine URI ist.
Für zB http://jira.company.com/rest/api/2.0/issue/12345 Ich habe einen Anwendungsfall, wo ich den Host von der oben angegebenen URI abrufen muss.So testen Sie verkettete Methodenanrufe mit Mockito

Ich kann das durch etwas wie issue.getSelf().getHost() tun.
issue.getSelf() gibt ein Objekt vom Typ 'URI' zurück und um den Host zu erhalten, kann ich einfach die getHost() Methode der URI Klasse verwenden, die die Host-URL im Format String zurückgibt.

Alles funktioniert gut. Ich stehe vor dem Problem, dieses Stück Code mit Mockito zu testen. Ich weiß nicht, wie man verkettete Methodenaufrufe verspottet.

Ich habe das folgende Code-Snippet.

private static final String JIRA_HOST = "jira.company.com"; 
@Mock private com.atlassian.jira.rest.client.api.domain.Issue mockIssue; 

@Before 
    public void setup() { 
     when(mockIssue.getSelf().getHost()).thenReturn(JIRA_HOST); 
    } 

Hier bekomme ich eine Null Pointer Exception.

Nachdem ich viel geforscht habe, habe ich erfahren, dass ich @Mock(answer = Answers.RETURNS_DEEP_STUBS) private com.atlassian.jira.rest.client.api.domain.Issue mockIssue; verwenden muss.
Aber das gibt mir auch eine Null Pointer Exception.

Kann mir jemand sagen, wie ich verkettete Methodenaufrufe verspotten kann.

+0

Können Sie eine http://stackoverflow.com/help/mcve mit dem tatsächlichen Code und Testcode als wir erstellen Gut. – StackFlowed

+0

@StackFlowed, Sie verstehen genau, das Code-Snippet, das ich der Beschreibung hinzugefügt habe, umfasst die Teile 'M',' C' und 'V'. Ich glaube nicht, dass es absolut notwendig ist, den ganzen Code einzubauen, nur um ihn ausführbar zu machen. Das Code-Snippet reicht aus, um die Frage zu beantworten. Ich sehe keinen triftigen Grund, warum zusätzlicher Code zur Verfügung gestellt werden sollte (und ich werde nicht einmal zur Verfügung stellen), um meine Frage zu beantworten. –

Antwort

2

Sie brauchen nicht RETURNS_DEEP_STUBS oder was auch immer diese Mock Annotation ist. Sie müssen nur jedes Objekt vortäuschen, das Sie in der Kette zurückgeben möchten, ähnlich wie folgt:

@Mock Issue issue; 
@Mock URI uri; 

@Before 
public void setup() { 
    when(uri.getHost()).thenReturn(JIRA_HOST); 
    when(issue.getSelf()).thenReturn(uri); 
} 
+3

Das ist so lahm. Die Jungs von Mockito sollten eine Art DeepMock erstellen. Das wäre cool. –

+0

@Downvoter - Irgendwelche Kommentare? – nickb