2016-04-24 16 views
0

Ich habe die folgende JUnit Test Suite. Wenn ich versuche, meine Tests zu laden, scheinen die Abhängigkeiten, die ich in den getesteten Klassen autowirte, nicht geladen werden, und ich bekomme den folgenden Fehler Nachricht:JUnit-Abhängigkeiten werden nicht geladen

package com.uk.jacob.service; 

import static org.junit.Assert.*; 

import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.springframework.boot.test.SpringApplicationConfiguration; 
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 
import org.springframework.test.context.web.WebAppConfiguration; 

import com.uk.jacob.model.Ping; 

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = PingerService.class) 
@WebAppConfiguration 
public class PingerServiceTests { 

    @Test 
    public void testPingerServiceReturnsOkWhenServiceIsUp(){ 
     PingerService pingerService = new PingerService(); 
     Ping ping = pingerService.ping("http://devnews.today"); 

     assertEquals(true, ping.ok); 
    } 

    @Test 
    public void testPingerServiceReturnsOkWhenServiceIsDown(){ 
     PingerService pingerService = new PingerService(); 
     Ping ping = pingerService.ping("https://jacob.uk.comz"); 

     assertEquals(false, ping.ok); 
    } 

} 

Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire method: public void com.uk.jacob.service.PingerService.setHttpAdapter(com.uk.jacob.adapter.HttpAdapter); nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.uk.jacob.adapter.HttpAdapter] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {} 

PingerService:

package com.uk.jacob.service; 

import java.io.IOException; 
import java.net.HttpURLConnection; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Component; 

import com.uk.jacob.adapter.HttpAdapter; 
import com.uk.jacob.model.Ping; 

@Component 
public class PingerService { 

    HttpAdapter httpAdapter; 

    public Ping ping(String urlToPing) { 
     Ping ping = new Ping(); 

     try { 
      HttpURLConnection connection = httpAdapter.createHttpURLConnection(urlToPing); 

      if(connectionIsOk(connection)){ 
       ping.ok = true; 
      } 
     } catch (Exception e) { 
      ping.ok = false; 
     } 

     return ping; 
    } 

    private boolean connectionIsOk(HttpURLConnection connection) throws IOException { 
     return connection.getResponseCode() == 200; 
    } 

    @Autowired 
    public void setHttpAdapter(HttpAdapter httpAdapter){ 
     this.httpAdapter = httpAdapter; 
    } 

} 

HttpAdapter:

package com.uk.jacob.adapter; 

import java.io.IOException; 
import java.net.HttpURLConnection; 
import java.net.URL; 

import org.springframework.stereotype.Component; 

@Component 
public class HttpAdapter { 
    public HttpURLConnection createHttpURLConnection(String urlToPing) throws IOException{ 
     URL url = new URL(urlToPing); 
     HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 

     connection.setRequestMethod("GET"); 
     connection.connect(); 

     return connection; 
    } 
} 
+0

Haben Sie die @Autowired aus der Setter zu entfernen versucht, und legen Sie es auf das Attribut? –

+0

Und erstellen Sie nicht in jedem Test ein neues PingService(). Die Erstellung von Objekten behandelt Spring für Sie. Injizieren Sie einen PingService in der Klasse Test mit @Autowired und verwenden Sie dies. –

Antwort

1

Du creatin g Ihr pingerService wie

PingerService pingerService = neu PingerService();

in der Testklasse, so ist es nicht eine Frühlingsbohne, so Frühling wird nichts dort nicht injizieren, es wird nicht funktionieren. Fügen Sie stattdessen den PingerService zu Ihrer Spring-Konfiguration hinzu: Kommentieren Sie ihn mit @Component und fügen Sie ihn irgendwo in den Klassenpfad ein oder erstellen Sie ihn mit einer Annotated-Methode @Bean in einer Ihrer Spring-Konfigurationsklasse.

Dies führt zum zweiten Problem:

@SpringApplicationConfiguration(classes = PingerService.class) 

Sie haben hier eine Konfigurationsklasse zu schaffen, und nicht einen einzelnen Dienst. Die Konfigurationsklasse muss die Spring Beans instanziieren, in Ihrem Fall mindestens PingerService und HttpAdapter.

Werfen Sie einen Blick auf Spring java config (older version)

Ihren Kommentar zu: Für die Config-Klasse wäre eine kommentierte @SpringBootApplication Klasse ausreichen?

Ja, das wäre ausreichend, wenn sich PingerService und HttpAdapter in Unterpaketen dieser mit SpringBootApplication annotierten Klasse befinden, sodass sie von ComponentScan gefunden werden können.

A ComponentScan wird automatisch konfiguriert, wenn Sie verwenden @SpringBootApplication

+0

Für die Config-Klasse wäre eine mit Anmerkungen versehene @SpringBootApplication-Klasse ausreichend? Welche ruft SpringApplication.run auf (SimplePingApplication.class, args); –

Verwandte Themen