2012-09-23 8 views
5

Ich habe eine große Anzahl von Testfällen, die mit Spring Junit Support mit folgenden Anmerkungen zu jedem Test ausgeführt wird.So erstellen und verwenden Sie eine benutzerdefinierte Annotation mit Spring + JUnit Test Config-Annotationen?

Anstatt alle diese Anmerkungen auf jede Testklasse zu setzen, möchte ich eine benutzerdefinierte Anmerkung erstellen und verwenden.

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations="classpath:spring/applicationContext.xml") 
@TransactionConfiguration(transactionManager="transactionManager") 
@Transactional 
@ActiveProfiles("test") 

@Target({ ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE }) 
@Retention(RetentionPolicy.RUNTIME) 
@Inherited 
public @interface SpringJUnit4TestConfig { 

} 

Aber wenn ich diese benutzerdefinierte Annotation Spring Injection nicht überhaupt geschieht.

@SpringJUnit4TestConfig 
public class UserServiceTest 
{ 
} 

Was fehlt mir hier?

PS: Aber JUnits @RunWith und Spring @Transactional, @ContextConfiguration haben alle @ Inherited..So dachte ich, es sollte funktionieren. Aber jetzt komme ich durch eine Arbeit durch. Eine Based Abstract-Klasse erstellt und all diese Anmerkungen und die Testfälle, die diese Basisklasse erweitern, hinzugefügt.

+0

Ich sollte nur @Target ({ElementType.TYPE}) verwenden Ich glaube nicht, dass Sie dies in einem Feld oder Parameter verwenden werden, oder werden Sie? – Koitoer

+0

Sie haben Recht. Diese benutzerdefinierte Anmerkung sollte nur für ElementType.TYPE gelten. –

+0

Ich wollte auch genau das Gleiche machen. Beim Lesen der Frage und der Antwort habe ich eine Annotation erstellt, die alle Konfigurationen außer '@ RunWith' verwendet und bisher anscheinend gut funktioniert. Ich verwende @RunWith (SpringJUnit4ClassRunner.class) auf jeder TestCase-Klasse. – ykesh

Antwort

2

Ich denke nicht, dass dieser Ansatz funktioniert, wie @RunWith ist JUnit Annotation, so dass dies funktioniert JUnit Annotationen müssen transitiv sein.

Wenn eine Klasse mit @RunWith kommentierten oder eine Klasse erweitert mit @RunWith kommentierte, wird JUnit die Klasse rufen Sie es, die Tests in dieser Klasse in JUnit gebaut anstelle der Läufer laufen verweist. Wir haben diese Funktion erst spät in der Entwicklung hinzugefügt. Obwohl es mächtig erscheint, erwarten wir, dass sich die Runner API ändert, wenn wir lernen, wie die Leute sie wirklich nutzen. Einige der Klassen, die derzeit intern sind, werden wahrscheinlich verfeinert und öffentlich werden.

So Test JUnit Test aufrufen scheint nur für die geerbten Klassen funktionieren.

Wie für Frühling, unterstützt es eine Sache context configuration inheritance für die Konfiguration Orten genannt, Ich bin nicht ganz sicher, dass dies für andere Anmerkungen Typen funktionieren sollte (bitte mich auf die Dokumentation verweisen, wenn Sie anders denken) Eigentlich ist dies wird wahrscheinlich für andere Annotationen im Falle einer Vererbung der Testkonfigurationsklasse funktionieren, da @Transactional Annotation selbst für diesen Fall mit @Inherited deklariert ist.

Also in diesem Fall wird es nicht ausgeführt, weil JUnit Annotation fehlt.

Verwandte Themen