2017-08-30 1 views
1

Ich fand den folgenden Code.@Autowired und Instanziierung

Bedeutet es, dass Spring die Instanz von myService überschreiben würde, die erstellt wird, wenn Foo erstellt wird?

Dieser Code ermöglicht die Verwendung von Foo im Junit-Kontext, ohne in einem Federkontext zu starten.

Ist es in Ordnung, solche Dinge zu tun?

+1

Sie sollten Spring's JUnit-Integration verwenden, um Ihre Tests auszuführen, statt dies zu tun. –

+0

Mögliches Duplikat: https://stackoverflow.com/questions/15122622/can-i-combine-manual-instantiation-with-autowiring –

+0

Sie sollten das eine oder andere tun, je nachdem, ob Sie Status benötigen –

Antwort

0

Nein, es ist nicht in Ordnung, solche Dinge zu tun. Stattdessen:

@Service 
public class Foo { 

    private MyService myService; 

    @Autowired 
    public Foo(MyService myService){ 
     this.myService = myService; 
    } 

}´ 

Auf diese Weise spritzt Frühling Ihre erforderliche Abhängigkeit beim Errichten des Services. Für einen JUnit Kontext benötigen Sie nur um es zu bieten haben, dann könnte es als eine echte Instanz sein oder als Mock:

@Test 
public void testFoo(){ 
    MyService mockService = mock(MyService.class); 
    Foo foo = new Foo(mockService); 
    foo.myMethod(); 
    verify(/*Check that foo has done whatever you want with MyService*/); 
} 
+0

Nur um dumme Kommentare hinzuzufügen, aber manchmal hilfreich, ist hier Mockito Mockito Framework, glaube ich? – Surinder

+0

Ja, aber Sie könnten jede andere Macher-Bibliothek verwenden –

0

oben Antwort hinzufügen, können Sie auch ContextConfig wie unten verwenden sie laufen können, wenn Sie Frühling verwenden 4

mit SpringBoot können Sie Bohne mit @Bean Anmerkung erstellen und dann autowire es

class MyTestConfig{ 
@Bean 
public MyService myService(){ 
return new MyService(); 
}; 

} 

Run Testfall mit MyTestConfig als contextConfiguration und autowire als

@Autowired 
public MyService myService 
Verwandte Themen