Erkennen, in welcher Methode sich die VM befindet

megalomaniac

Mitglied
Hallo zusammen,

folgender Hintergrund:

Ich habe einen Haufen an JUnit-Tests, in denen ich folgende Logmeldungen ausgebe:
Java:
logger.info("Starte Unit-Test " + this.getClass().getSimpleName() + ".testMethode():");

Da Copy-Paste bekanntlich der natürliche Feind der Korrektheit ist, gibt es einen ganzen Haufen an Testmethoden, in denen der Name der ausgegebenen Methode schlichtweg falsch ist.

Ich suche jetzt nach einer Möglichkeit den Namen der Methode, die gerade ausgeführt wird, dynamisch zu ermitteln. Eine Idee wäre ein Zugriff auf den Programm-Stack der VM, aber ich habe keine Ahnung wie das in Java möglich ist, bzw. ob überhaupt.

Hat hier jemand Erfahrung mit sochen Dingen? Vielleicht hat ja auch jemand einen alternativen Ansatz in petto?
 
Zuletzt bearbeitet:
Sollte so funktionieren:
Java:
StackTraceElement[] s = Thread.currentThread().getStackTrace();
String method = s[1].getMethodName();

EDIT: zu spät :rtfm:
 
aber nicht diese Zeilen in jede Methode schreiben,
einfach nur ein Aufruf
logBegin();

und diese Methode holt sich dann aus dem StackTrace nicht den eigenen Namen, der wäre ja immer logBegin 😉 ,
sondern den des Aufrufers, das geht auch bestens, das ganze Array anschauen

die ganze Zeile
> logger.info("Starte Unit-Test "
usw. spart man sich auch noch, es bleibt der kürzestmögliche Methodenaufruf,

will man mal das Logger-Level umstellen oder englischen Text oder sonst etwas,
dann auch nur in dieser einen Methode ändern statt überall Arbeit,
Indirektion lohnt sich fast immer!

------


noch schöner wäre es auch ohne diesen Aufruf, aber nicht ganz so leicht, AOP mag da helfen,
oder in Java bisschen generischeres/ Reflection Verhalten,
z.B. nicht die Klasse an sich aufrufen sondern einen Proxy, der Aufrufe in Standard-Methoden mit Methodenname als Parameter umleitet

Explore the Dynamic Proxy API - JavaWorld
ziemlich kompliziert, nicht wegen 50x logBegin();, bei 500x logBegin(); schon eher 😉

-----

edit: wenn es immer dieselbe Methode ist, nur in unterschiedlichen Klassen,
da hilft Vererbung als noch einfacheres Konzept,
testMethode() in Oberklasse logt den Namen, ruft dann testMethodeIntern() auf, welches alle erbenden Klassen implementieren

Vererbung ist immer die erste Anlaufstelle, nur bei zig einzelnen Methoden schlecht dran,

edit2:
was ja doch auch wieder das Thema hier ist, erster Edit nicht ganz so dringend 😉
 
Zuletzt bearbeitet von einem Moderator:
Hat hier jemand Erfahrung mit sochen Dingen? Vielleicht hat ja auch jemand einen alternativen Ansatz in petto?

Wenn deine Testklassen von TestCase ableiten, dann gibt es da eine vererbte Methode
Code:
getName()
. Das heißt bei mir steht in der
Code:
setUp()
-Methode immer:
Java:
logger.info("Started {0}#{1}", getClass().getSimpleName(), getName());
(Und natürlich gibt er dann nicht setUp aus, sondern den Namen der aktuellen Test-Methode. Also die, die mit @Test annotiert ist.)
 

Zurück
Oben