2016-06-22 9 views
0

Ich versuche ValidatorService in Unit Tests von SubscriptionInterceptor Mock.Mockito wenn/dann funktioniert nicht

validator = Mockito.mock(ValidatorService.class); 
Mockito.when(validator.validateSubscription(any(), any(), any())).thenReturn(""); 
interceptor = new SubscriptionInterceptor(validator); 

Später, als die Abfangjäger die validateSubscription Methode des verspottet Validator aufruft, wird eine Instanz der tatsächlichen Klasse aufgerufen, anstatt die Mock. Warum? Wie kann ich den Methodenaufruf erhalten, um eine leere Zeichenfolge zurückzugeben?

+1

Sie sollten nichts Besonderes für die leere Zeichenfolge benötigen, die zurückgegeben werden soll; Es ist der Standard-Rückgabewert, solange Mockito die Methode stubben kann, was hier anscheinend nicht möglich ist. Können Sie bestätigen, dass sowohl ValidatorService als auch validateSubscription öffentlich und nicht "final" sind? –

+0

Methode wurde endgültig erklärt. Es funktioniert jetzt, danke! –

Antwort

1

in den Kommentaren Entschlossen:

Methode final deklariert wurde.

Mockito funktioniert durch Bereitstellung eines Proxy (Unterklasse) der betreffenden Klasse, mit jeder der Methoden außer Kraft gesetzt. Für final Klassen und Methoden geht Java jedoch davon aus, dass es erkennen kann, welche Implementierung aufgerufen werden muss, und überspringt die dynamische Methoden-Suche. Aus diesem Grund kann Mockito nicht das Verhalten für final Methoden, static Methoden oder Methoden auf final Klassen überschreiben, und weil Sie nicht mit dem Mockito interagiert können Sie nicht einmal davor warnen.

Dies ist ein sehr häufiges Problem; Stellen Sie sicher, dass Sie nach final Feldern suchen, wenn Mockito nicht für das Stubbing/Verifizieren Ihrer Methode arbeitet.