Was ist der beste Weg, um zu injizieren, verspottet Spring @Autowired Abhängigkeiten von einem unit test?
import org.springframework.beans.factory.annotation.Autowired;
class MyService {
@Autowired private DependencyOne dependencyOne;
@Autowired private DependencyTwo dependencyTwo;
public void doSomething(){
//Does something with dependencies
}
}
Beim testen dieser Klasse, die ich im wesentlichen vier Möglichkeiten, um zu injizieren, mock Abhängigkeiten:
- Verwendung von Spring ReflectionTestUtils im test zu injizieren der Abhängigkeiten
- Fügen Sie einen Konstruktor hinzu MyService
- Hinzufügen setter-Methoden zu MyService
- Entspannen die Abhängigkeit Sichtbarkeit package-protected, und legen Sie die Felder direkt
Welche ist die beste und warum?
- - - - UPDATE ---
Ich denke, ich hätte ein wenig klarer - ich spreche hier nur über "Einheit" - Stil-tests, nicht Frühling "integration" style tests, in denen die Abhängigkeiten können so verdrahtet werden, mit einem Spring-Kontext.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden
ReflectionTestUtils
oder setzen Sie einen setter. Entweder ist in Ordnung. Hinzufügen von Konstruktoren Nebenwirkungen haben können (disallow Unterklassen von CGLIB zum Beispiel), und die Lockerung der Sichtbarkeit nur für die Zwecke der Prüfung ist kein guter Ansatz.new
ing die Klasse MyService.Spring ContextConfiguration kann dies für Sie tun.
Beispielsweise im test-Kontext unter dem "Local" - Klassen werden verspottet.
NotificationService
ist die Klasse die ich testen will.Ich bin mit Komponente Scannen zu bringen, der verhöhnt in dem Zusammenhang, aber Sie können genau so gut
<bean>
Erklärungen. Beachten Sie die Verwendung von use-default-Filter="false".DelegatingTemplateService ist eine Groovy-Klasse mit einer @Delegieren.
In der test-Klasse ich den test-Kontext und Spritzen den service zu testen. Im setup habe ich den Delegierten des DelegatingTemplateService:
In den Dienst der @Autowired-Felder sind privat:
2) mit @Autowired Konstruktor-Injektion (wenn es das ist, was die option 2 war; andernfalls stellen Sie eine option 5)
Richtige Konstruktoren, erstellen Sie ein Objekt in einem gültigen Zustand ist eine richtig Objekt-orientierte Ansatz, und verlieren cglib-proxies ist relativ unwichtig, da wir alle code-Schnittstellen ohnehin, richtig??