2016-08-14 5 views
6

Haben Sie ein sehr leichtes Spring Boot 1.4 Projekt, generiert von start.spring.io.Spring Boot 1.4 - TestRestTemplate Nicht befriedigte Abhängigkeit Ausnahme

Der Versuch, einen Integrationstest für @RestController mit @RequestBody unter Verwendung von TestRestTemplate auszuführen, aber es gibt keinen Erfolg wegen einer Startausnahme.

Die einzige Konfigurationsklasse:

@SpringBootApplication 
public class Application { 

    public static void main(String[] args) { 
     SpringApplication.run(Application.class, args); 
    } 
} 

Konfigurationsdatei application.properties hat fast nichts außer security.ignored=/** für die Testzwecke.

Die Testklasse:

@RunWith(SpringRunner.class) 
@SpringBootTest 
@DataJpaTest 
public class MyControllerTest { 

    private Logger log = Logger.getLogger(getClass()); 

    @Autowired 
    private TestRestTemplate restTemplate; 

    @Autowired 
    private TestEntityManager entityManager; 

    @Before 
    public void init() { 

     log.info("Initializing..."); 
    } 

    @Test 
    public void addTest() throws Exception { 

     log.info("MyController add test starting..."); 

     // restTemplate usage 

     log.info("MyController add test passed"); 
    } 
} 

... aber während der Teststart ich die folgende Ausnahme erhalten:

ERROR 6504 --- [   main] o.s.test.context.TestContextManager  : Caught exception while allowing TestExecutionListener [org.springframework.b[email protected]5444f1c3] to prepare test instance [[email protected]] 

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'com.myproject.controllers.MyControllerTest': Unsatisfied dependency expressed through field 'restTemplate': No qualifying bean of type [org.springframework.boot.test.web.client.TestRestTemplate] found for dependency [org.springframework.boot.test.web.client.TestRestTemplate]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.boot.test.web.client.TestRestTemplate] found for dependency [org.springframework.boot.test.web.client.TestRestTemplate]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:569) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 

Nach dem doc ist es nicht erforderlich TestRestTemplate überall zu konfigurieren. Ich habe jedoch den neuen Apache Http Client wie empfohlen zum Classpath hinzugefügt.

Was habe ich verpasst?

+0

haben gerade gefunden '@ AutoConfigureTestDatabase' Anmerkung in Verbindung verwendet werden soll, mit' @ SpringBootTest' statt '@ DataJpaTest' im Fall so was – WildDev

Antwort

0

Ich hatte ein ähnliches Problem die Hauptklasse auf Eclipse Serenity BDD Tests mit einem feder Boot läuft. Es beginnt zu versagen, nachdem ich die Testabhängigkeit spring-boot-test-autoconfigure hinzugefügt habe. Das passiert, weil Eclipse alles in nur einem Klassenlader platziert. Um diesen Fehler zu beheben, habe ich eine Konfigurationsklasse erstellt, die das Standardverhalten des Spring-Boot überschreibt. Dieser Code wurde in einem Feder Klasse basiert (der Umfang nicht öffentlich ist) SpringBootTestContextCustomizer.TestRestTemplateFactory

@TestConfiguration 
public class TestConfig { 

    // Overriding Default Spring Boot TestRestTemplate to allow 
    // execute the main method from Eclipse (mixed Classloader) 
    @Bean 
    @Primary 
    public TestRestTemplate testRestTemplate(ApplicationContext context, RestTemplateBuilder templateBuilder) { 
     final AbstractConfigurableEmbeddedServletContainer container = context.getBean(AbstractConfigurableEmbeddedServletContainer.class); 
     final boolean sslEnabled = container.getSsl() != null && container.getSsl().isEnabled(); 
     final TestRestTemplate template = new TestRestTemplate(templateBuilder.build(), null, null, sslEnabled? new HttpClientOption[]{}: new HttpClientOption[]{HttpClientOption.SSL}); 
     template.setUriTemplateHandler(new LocalHostUriTemplateHandler(context.getEnvironment(), sslEnabled ? "https" : "http")); 
     return template; 
    } 
} 
Verwandte Themen