2016-04-26 4 views
1

Ich kämpfe den Code unten verspotten zu verspotten:Wie ElasticSeach Kunde

Client client = TransportClient.builder().settings(settings).build().addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300)); 

Mein Ansatz:

Settings.Builder settingsBuilder = mock(Settings.Builder.class); 
when(settingsBuilder.put(new String("test"), new String("test"))).thenReturn(settings.settingsBuilder()); 
when(settingsBuilder.build()).thenReturn(settings); 

TransportClient.Builder clientBuilder = mock(TransportClient.Builder.class); 
when(clientBuilder.settings(settings)).thenReturn(clientBuilder); 

Bis zu diesem Punkt der Test funktioniert gut, aber wenn man versucht, das zu verspotten andere Klassen auf dem Client verwendet, löst Mockito die folgende Ausnahme aus:

Fehler:

org.mockito.exceptions.misusing.MissingMethodInvocationException: 
when() requires an argument which has to be 'a method call on a mock'. 
For example: 
when(mock.getArticles()).thenReturn(articles); 

Also, this error might show up because: 
1. you stub either of: final/private/equals()/hashCode() methods. 
Those methods *cannot* be stubbed/verified. 
Mocking methods declared on non-public parent classes is not supported. 
2. inside when() you don't call method on mock but on some other object. 

Frage:

Nun, ich undertand, dass diese geworfen werden können, weil ich nicht etwas richtig spöttisch, aber ich kann nicht herausfinden, was mit meinem spöttischen diesmal falsch ist. Wie kann ich den Client korrekt verspotten, so dass alle abhängigen Klassen verspottet werden und ein neuer verspotter Client zurückgegeben wird?

Danke.

Antwort

0

Ich werde hier ein wenig raten, basierend auf Ihren Klassennamen.

Client client = TransportClient.builder().settings(settings).build().addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300)); 

vorausgesetzt TransportClient.builder() gibt transportClient.Builder, dann müssen Sie:

when(clientBuilder.settings(anyOf(Settings.class)).thenReturn(clientBuilder); 
when(clientBuilder.build()).thenReturn(a transport client mock); 

TransportClient.addTransportAddress, ich werde, zu übernehmen braucht kein Mock - es ist nur muss verifiziert werden.

+0

Hallo @Jerry Andrews Vielen Dank für Ihren Vorschlag. Es löste das Problem, aber jetzt bekomme ich den folgenden Fehler: Wollte, aber nicht aufgerufen: TransportClient.addTransportAddress ( localhost/127.0.0.1: 9300 ); Ich habe die addTransportAddress überprüft, siehe unten überprüfen (mockedTransportClient) .addTransportAddress (neue InetSocketTransportAddress (InetAddress.getByName ("localhost"), 9300)); Wissen Sie, was dieses Problem jetzt verursacht? Danke – Bob

+0

Alles, was ich vorschlagen kann, ist, dass Sie einen Addor zu addTransportAddress hinzufügen, anstatt den eingehenden genau zu überprüfen, und sehen, wie es tatsächlich aufgerufen wurde (wenn es überhaupt aufgerufen wurde). –

Verwandte Themen