Die Injektion Mockito Mock objects mit Spring JavaConfig und @Autowired
Ich versuche zu ersetzen @Autowired
Objekt mit Mockito mock-Objekt. Der übliche Weg, dies zu tun, wurde mit xml mit Springockito:
<mockito:mock id="SomeMock" class="com.package.MockInterface" />
Derzeit bin ich versucht zu bewegen, um mit Spring JavaConfig für den job. Plötzlich ist die Java-Ausdrücke sind eine ganze Menge mehr Informationen als xml:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class MyTestClass {
@Configuration
static class Config {
@Bean
public MockInterface somethingSpecial() {
return Mockito.mock(MockInterface.class);
}
}
@Autowired MockInterface mockObj;
//test code
}
Entdeckte ich eine Bibliothek namens Springockito-Annotationen, die ermöglicht es Ihnen, Folgendes zu tun:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader=SpringockitoContextLoader.class)
public class MyTestClass {
@Autowired @ReplaceWithMock MockInterface mockObj;
//test code
}
Klar, eine ganze Menge hübscher 🙂 Das problem ist nur, dass dieser Kontext loader erlaubt mir nicht, zu verwenden @Configuration
und JavaConfig für andere-Bohnen (wenn ich das Tue, Frühjahr beklagt, dass es keine Kandidaten, mit denen autowired Felder).
Tun Sie Jungs wissen, einen Weg, um von Spring JavaConfig und Springockito-Anmerkungen zu spielen schön? Alternativ gibt es noch ein Kürzel für die Erstellung von mocks?
Als ein netter bonus, mit Springockito und xml-config, ich war in der Lage zu verspotten, konkrete Klassen, ohne autowiring Kandidaten, um seine Abhängigkeiten (wenn es hatte). Ist dies nicht möglich, ohne xml?
- Vielleicht bin ich ein bisschen verwirrt, aber warum nicht Sie
@Autowired
die Bohnen, die Sie wollen von Ihrem Anwendungskontext, und@Mock
die Bohnen möchten Sie verspottet? Hinweis: wenn Sie@Mock
, müssen Sie initialisiert werden diejenigen verspottet, die durch aufrufenMockitoAnnotations.initMocks(this)
in der test-Klasse, die vor jedem test. - warum gehst du nicht einfach Draht von hand für Ihren test?
- Wenn ich will, um den Draht von hand aus, die ich brauche, die Klasse zu wechseln, mir zu erlauben, injizieren Sie die mock-Objekte. Was Springockito können Sie tun, um die vorhandenen autowiring-Mechanismus zu injizieren verspottet.
- Warum würden Sie haben, die Klasse zu wechseln? Wenn es injiziert durch Konstruktor, brauchen Sie nur den Konstruktor aufrufen. Wenn es injiziert durch setter, Sie brauchen nur zu rufen, der setter. Und wenn es über Feld-Injektion, die Sie gerade brauchen, um verwenden Sie die
@Mock
und@InjectMocks
Anmerkungen in Ihrem test (der funktioniert auch mit Konstruktor und setter-Injektion).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Abkehr von der jetzt unbetreut (als dies geschrieben wurde) Spingockito-Anmerkungen und Mockito, haben wir eine Möglichkeit, dies zu tun ist sehr einfach:
Wenn Sie ein reales Objekt, sondern möchte zu verspotten, eine Abhängigkeit innerhalb der it, beispielsweise die Prüfung einer service-Schicht mit DAO:
Schließlich, dies kann auch angewendet werden, um Spring-boot, aber mit Hilfe der annotation Initialisierung innerhalb
setUp()
bis mehrere Klasse-Läufer werden unterstützt:Überholt und veraltet!
Lesen über Spott und Spionage in Spring-Boot-1.4
Bitte Lesen Sie auch @ethesx Antwort,
Springockito ist unmaintaned
Alte Antwort
Dies ist möglich, jetzt zu verspotten, Spring-Anwendung ohne jede XML-Datei mit Springockito-Anmerkungen.. Diese Lösung funktioniert auch mit Spring Boot.
Abhängigkeiten:
org.kubek2k:springockito-annotations:1.0.9
Scheint es, dass
SpringockitoContextLoader
erstreckt GenericXmlContextLoader, die beschrieben wird als:Also Sie sind beschränkt auf die xml-bean-Definitionen in dem moment.
Könnten Sie schreiben Ihre eigenen context-loader, wobei die relevanten Teile von der
SpringockitoContextLoader
Klasse. Werfen Sie einen Blick hier, um begonnen zu erhalten, könnten Sie vielleicht erweitern AnnotationConfigContextLoader zum Beispiel?