2016-08-05 20 views
0

Wenn ich meine Anwendung als Spring Boot-Anwendung starte, wird ServiceEndpointConfig ordnungsgemäß automatisch gebootet. Aber wenn ich als Junit-Test laufe, bekomme ich die folgende Ausnahme. Ich verwende application.yml Datei und verschiedene Profile.Spring Unit-Test

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = MyServiceContextConfig.class, 
loader = SpringApplicationContextLoader.class) 
@ActiveProfiles({"unit", "statsd-none"}) 
public class MyServiceTest 
{ 
} 

@Configuration 
public class MyServiceContextConfig { 

    @Bean 
    public MyService myServiceImpl(){ 
     return new MyServiceImpl(); 
    } 
} 

@Configuration 
@Component 
@EnableConfigurationProperties 
@ComponentScan("com.myservice") 
@Import({ServiceEndpointConfig.class}) 
public class MyServiceImpl implements MyService { 

    @Autowired 
    ServiceEndpointConfig serviceEndpointConfig; 

} 

@Configuration 
@Component 
@ConfigurationProperties(prefix="service") 
public class ServiceEndpointConfig 
{ 
} 

Fehler:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'myServiceImpl': 
Unsatisfied dependency expressed through field 'serviceEndpointConfig': No qualifying bean of type [com.myservice.config.ServiceEndpointConfig] found 

Antwort

2

Sie Umgang mit MyServiceImpl inkonsequent: Auf der einen Seite sind Sie Scan-Annotationen verwenden, und auf der anderen Seite, sind Sie explizit eine @Bean in einer Konfiguration zu schaffen Klasse. Die Importrichtlinie wird nur verarbeitet, wenn Spring MyServiceImpl durch Scannen auswählt; Andernfalls wird es nicht als Konfiguration behandelt.

Ihre Beziehungen zwischen den Klassen sind verwickelt; der ganze Punkt der Abhängigkeits-Injektion ist, dass MyServiceImpl sollte sagen, was für eine Art es braucht, aber nicht selbst erstellen. Diese Organisation ist nicht besser, als manuell Abhängigkeiten manuell zu erstellen.

, sondern

  • beseitigen die @Configuration und @Import Richtlinien von MyServiceImpl,
  • Verwendung Konstruktor Injektion auf MyServiceImpl und
  • Änderung Ihre Testkonfiguration alle notwendigen Konfigurationsklassen aufzunehmen.

Mit Konstruktor Injektion können Sie in der Lage sein, den Frühling Kontext ganz zu umgehen und dies als einen tatsächlichen Einheit Test ausgeführt, indem einfach ein new MyServiceImpl(testServiceConfig) zu schaffen.