Wie simulieren Sie eine Methode in eine ENUM-Klasse?
Arbeite ich auf das schreiben von JUNIT-Testfall für mein unten ENUm-Klasse. Meine unten Klasse wird nur geben Sie mir den Hostnamen für die aktuelle Maschine, wo ich bin mit meinem code. Während ich Schreibe, JUNIT-test, wie kann ich verspotte die unten Klasse, so dass ich ändern kann getHostName()
- Methode, Wann immer ich will, so dass wenn immer ich rufe getDatacenter()
es zurückgeben kann mich, was auch immer hostname bin ich vorbei lustig. Ich will nicht, um es als eingestellt.
Ich will einfach nur, um zu testen, bestimmten Fällen, während Sie ändern Sie den Hostnamen, während lustig.
public enum DatacenterEnum {
DEV, DC1, DC2, DC3;
public static String forCode(int code) {
return (code >= 0 && code < values().length) ? values()[code].name() : null;
}
private static final String getHostName() {
try {
return InetAddress.getLocalHost().getCanonicalHostName().toLowerCase();
} catch (UnknownHostException e) {
s_logger.logError("error = ", e);
}
return null;
}
public static String getDatacenter() {
return getHostName();
}
}
- Diese Methode werden in der enum-Klasse? Es scheint keine Verweise zwischen den enum-Werte und die Methoden.
- Ich habe entfernt die Informationen aus dem code.. Es gibt einige Methoden die sich mit diesen details entsprechend aus der hostname.. Also mein Haupt-Anziehungspunkt war die Verspottung getHostName-Methode, um die anderen codes revovlve..
- stackoverflow.com/a/9722244/516167
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist es möglich, aber das ist nicht empfohlen, es wäre besser, Umgestaltung des Codes.
Beispiel arbeiten mit Mockito/PowerMock
Abhängigkeiten
Einfach mit JMockit:
Könnte man auch spotten die
getHostName()
Methode im enum, natürlich, aber es ist am besten zu vermeiden, Spottprivate
Methoden.Könnten Sie ein Datacenter-Schnittstelle und die enum-Implementierung der Schnittstelle. Dies würde die Verspottung einfacher.
Allem würde ich keine Konfigurations-Informationen in einem Enum zu beginnen. Wenn Sie jemals das hinzufügen einer anderen Datacenter (oder die config von einen Datacenter-änderungen), müssen Sie den code neu kompilieren. Sollten Sie die Konfiguration in eine normale Klasse zu Lesen zum Beispiel eine java-properties-Datei oder eine XML-Datei. (Diese Funktion wird möglicherweise bereits Umsetzung in Ihrem Rahmen.)
Wenn dies nicht möglich ist, verwenden Sie "darkes reflaction" Magie zu ändern Felder in Enum die gewünschten Werte.
Dies ist ein Weg, können Sie es mit Mockito/Powermock. Sie müssen Powermock, weil Mockito ist nicht in der Lage zu verspotten statische Methoden:
Maven-Abhängigkeiten
Bin ich vielleicht old-school, aber ich würde mich wirklich überarbeiten Sie den code unter test anstatt classloader hacks. So etwas wie:
und in den test-code noch vor der Ausführung des Tests:
ClassLoader
sind eine Klasse zu laden, auf seine erste Referenz, was bedeutet, dass statische Initialisierungen. Der OP hat einUnknownHostException
geworfen, und jetzt haben Sie es verschoben auf einen statischen Feld-Initialisierung, Initialisierung hat jetzt die chance für eine Ausnahme zu vermehren, bis zu denClassLoader
. Ihre zukünftigen Zuordnung zuhostName
wird in einemNoClassDefFoundError
, wenn irgendeine Art von an-oder abgewählt Ausnahme wurden geworfen werden. Es ist nicht eine gute Idee, um Methoden, die exceptions werfen, die in der ungeprüften Initialisierungen.InetAddress#getLocalHost()
Funktion, die die Ausnahme ausgelöst, und die javadocs nur scheinen zu zeigenif the local host name could not be resolved into an address.
Aber in fairness, ich habe wirklich nicht gedacht, über diesen Punkt mich zu denken, warum das geschehen konnte. Aber es geschieht in Fällen von: stackoverflow.com/questions/1881546/... . I ' TS mehr, ich bin nur von der Einstellung, defensive Programmierung für verringerte Wartung.