Method-Annotations in aufgerufener Methode auswerten

Novanic

Bekanntes Mitglied
Hi,

ich habe mal eine etwas speziellere Frage zu Annotations. Ich möchte Tests per Annotations konfigurieren, anstatt irgendwelche "old-style" Initialisierungsmethoden zu verwenden. Z.B. möchte ich dass jeder Test ein Datum angeben kann, das zur Ausführung das aktuelle Datum simuliert.

Im Moment sieht mein Test z.B. so aus. Die render-Methode liegt in der abstrakten Test-Oberklasse und führt die zu testende Logik aus. Die setUp-Methode liegt auch in der Oberklasse und setzt vorher das zu verwendende Datum.
Java:
public void testRender() {
        super.setUp("2010-06-05");
        
        String theResult = super.render("XY");
        assertEquals("05.06.2010 - XY");
    }

Nett wäre z.B. so etwas:
Java:
@CurrentTestDate(date = "2010-06-05")
public void testRender() {
        String theResult = super.render("XY");
        assertEquals("05.06.2010 - XY");
    }
Die render-Methode müsste die Annotation auswerten bevor die zu testende Logik ausgeführt wird. Die Schwierigkeit hierbei ist, dass der Methodenname nicht bekannt ist, weil die Logik in der Oberklasse liegt. Man könnte natürlich über den Stacktrace gehen, aber so schön und sicher ist das wahrscheinlich nicht. Hat jemand eine bessere Idee?

Danke schonmal.

Gruß Sven
 
Das ist doch sogar noch mehr Schreibarbeit als ein einfaches setTestDate("2010-06-05")...
Über den Stack zu gehen währe die einzige Möglichkeit wenn der Aufrufer sich nicht selbst mitgibt und das ist ein ziemlicher Hack.
Ich sehe zwar nicht wirklich was du dir davon erhoffst, aber theoretisch könntest du wohl mit Dependency Injection arbeiten um solche Properties zu initialisieren, da deine Tests ja von der Klasse erben die die Initialisierung vornehmen.
 
Man möge mich verbessern, wenn ich falsch liege. Aber ginge nicht folgendes?

Java:
public String render(String xyz)
	{
		String testDatum = null;
		for(Method m : this.getClass().getDeclaredMethods())
		{
			if(m.isAnnotationPresent(CurrentTestDate.class))
			{
				CurrentTestDate meinTestDatum = m.getAnnotation(CurrentTestDate.class);
				testDatum = meinTestDatum.date();
				break;
			}
		}
		
		/*
		 * Was auch immer für Logik ausgeführt wird...
		 */
		
		return "Ergebnis: " + testDatum;
	}

Oder verstehe ich jetzt alles ganz falsch? Ich bitte um Überprüfung 😀

Gruß
 

Neue Themen


Zurück
Oben