2016-11-24 1 views
1

Gibt es eine gute Möglichkeit, Power-Mockito zu verwenden, um die unten im Code gezeigte statische Methode zu verspotten?Power Mock-Unit-Tests für statische Methoden des lokalen Bereichs

@Singleton 
public class AnimalWorks { 

    public void verifyAnimal(Protocol proto, Set<Animal> successAnimals, Set<AnimalRule> rules, String zookeeper,OtherParams additionalParams) throws AnimalException, DAOException { 
     ... 

     // Static method call to fromAnimalId(arg1,arg2) below: 
     // How to mock this method call with PowerMockito so I can have a custom aniSet? 

     Set<Animal> aniSet = AnimalGenerator.fromAnimalId(dbtool, additionalParams); 

     ... 

    } 

} 

Antwort

2

Verspottender statischen Methoden PowerMock erläutert beispielsweise here ist.

Aber bitte beachten Sie: wenn Sie über Ihre eigenen Produktionscode sprechen, dann ist dies nur die zweitbeste Lösung! Denn: Das statische Anruf ist eigentlich ein Design Problem.

Ja, statische Methoden sind praktisch, aber sie führen auch zu einer direkten/engen Kopplung Ihres Codes. Und natürlich, sie brechen normale Komponententests mit EasyMock oder Mockito ...

So ist die alternative Antwort: Verwenden Sie nicht PowerMock. Treten Sie stattdessen zurück und entfernen Sie die statische Abhängigkeit von Ihrem Code. Zum Beispiel durch das Erstellen einer Schnittstelle, die die erforderliche Funktionalität bezeichnet; und dann verwenden Sie Abhängigkeitsinjektion, um diesen statischen Aufruf innerhalb Ihres Codes vorzunehmen, um ein Objekt zu erwerben, das diese Schnittstelle implementiert.

Und auf einmal brauchen Sie PowerMock nicht mehr.

Schlusswort der Warnung: Viele Leute benutzen PowerMock ohne viel Probleme. Aber wenn Sie etwas recherchieren, werden Sie auch viele Leute finden, die alle Arten von seltsamen Problemen mit PowerMock haben. Also, wählen Sie nicht nur dieses Werkzeug, weil es bequemer erscheint. Verstehen Sie, dass Verbesserung Ihr Design vollständig tötet die Notwendigkeit für die Verwendung dieses Tools!

EDIT:

Der Punkt ist: Sie sollten nie Dinge tun, weil jemand sagt, dass "es so". Im Idealfall lernen Sie die Vor- und Nachteile der verschiedenen Ansätze kennen, und dann entscheiden Sie, welchen Weg Sie einschlagen sollten. abhängig von dieser Analyse. Natürlich war statische in Java seit dem allerersten Tag verfügbar; daher gibt es viele Leute, die nette Anwendungsfälle dafür zeigen.

Aber das ändert nicht die Nachteile, die ich erwähnte (direkte, enge Kopplung). Sache ist: ich vollständig gestoppt mit Statik - in Möglichkeiten, die von Unit-Tests zu verhindern. Und das habe ich nie bereut.

Und Sie sehen, es gibt Leute, die behaupten, dass statische Sie verhindert, dass die Schaffung prüfbar Code - (! Diese Videos anzusehen ist jede Minute wert) wie here. Es ist nicht so, dass ich auf diese Idee gekommen bin.

+0

Das Problem ist, dass als eine statische Factory-Methode modelliert wird, wie in effektiven Java beschrieben. https://books.google.com/books?id=ka2VUBqHiWkC&lpg=PA5&pg=PA5#v=onepage&q&f=false – user46743

+0

Siehe meine aktualisierte Antwort. – GhostCat

+0

Einverstanden. Die Wahl der statischen Methode für diese nicht-instanziierbare Klasse ist eine Entwurfszeitentscheidung, die jetzt schwer zu ändern ist. Zurück zu diesem Problem - ich schaute auf den Dzone-Artikel, während es viele Teile berührt, um dieses Rätsel zu lösen Ich habe immer noch eine harte Zeit, es für mein Beispiel oben arbeiten zu lassen, und es wäre wirklich hilfreich, wenn ein Test-Code Schnipsel für das obige Problem bereitgestellt werden. – user46743