2017-02-08 4 views
3

Ich habe ein Spring-Boot-Projekt, das eine Reihe von Komponententests hat, die die @InjectMocks von Mockito verwenden, um sowohl die zu testende Klasse zu instanziieren als auch etwaige Mocks einzufügen.@Autowire kombiniert mit @InjectMocks

Mit anderen Worten, wenn ich dieses

@InjectMocks MyClass myClass;

Dann brauche ich nicht

MyClass myClass = New MyClass();
oder @Autowired MyClass myClass;

Bis jetzt funktionierte dieses Setup gut.

In jüngerer Zeit ist es jedoch notwendig geworden, beim Ausführen von Tests auf die Spring-Boot-Eigenschaften des Projekts zuzugreifen. Dies bedeutet, dass der SpringBoot-Task-Runner in Tests verwendet werden musste, damit alle Instanzen von @Autowire (einschließlich derjenigen, die die Environment-Klasse instanziieren) funktionieren.

Ich entdeckte, dass wenn @InjectMocks verwendet wird, um eine Klasse zu instanziieren, alle Instanzen von @Autowired innerhalb der Klasse nicht funktionieren (das Objekt, das sie erstellen sollten, ist null). Dies bedeutet keine Environment-Klasse und keinen Zugriff auf Spring-Eigenschaften.

Stattdessen habe ich @Autowired auf die @InjectMocks Anmerkung

so dass diese

@InjectMocks MyClass myClass hinzuzufügen;

wird diese

@Autowired
@InjectMocks MyClass myClass;

Meine Frage ist einfach. Ist etwas falsch daran, dies zu tun? Doubles instantiate myClass oder alles, was Störungen verursachen kann

Antwort

4

Ich denke, dass Sie die Anmerkungen, die zum Frühling gehören und die, die zu Mockito gehören, vermischen.

Wenn Sie nur Ihre Webanwendung ausführen, stellt @Autowired Ihrer Klasse eine bestimmte Abhängigkeit zur Verfügung. Auf diese Weise müssen Sie keine Objekte mit dem Schlüsselwort new manuell erstellen. Zur Laufzeit sind jedoch nur die Federnotizen im Spiel. Die Mockito-Annotationen sind nicht für diesen Anwendungsfall gedacht.

Wenn Sie Tests durchführen, ist es umgekehrt. Jetzt machen die Frühlingsanmerkungen nichts, es sind die Mockito-Annotationen, die funktionieren. @InjectMocks wird Spott sagen: "Alles, was ich mit @Mock zur Verfügung gestellt und das wird von dieser Klasse benötigt, einfach kleben Sie es dort". Es wird das tun, selbst wenn Sie @Autowired auf diesem Feld nicht gesetzt haben. Mockito interessiert sich nicht für Frühlingsanmerkungen.

Für Ihre Frage: Ich sehe keinen Anwendungsfall, in dem Sie @Autowired und @InjectMocks an derselben Stelle platzieren würden. Verwenden Sie Frühlingsanmerkungen in der Logik Ihrer Anwendung und Mockito-Anmerkungen in Ihren Tests.

Ich weiß, die Antwort ist ziemlich abstrakt, aber so ist Ihre Frage. Um genauere Hilfe zu erhalten, sollten Sie a minimal, complete and verifiable example angeben.