2017-12-29 16 views
1

Ich möchte eine @ Service-Klasse testen, die normalerweise mit SpringApplication.run() aufgerufen wird.Testen von Spring-Boot @ Service Klasse

Die Service-Klasse ist:

@Service 
@EnableConfigurationProperties(AppProperties.class) 
public class MongoService { 

    private static final Logger logger = LoggerFactory.getLogger(MongoService.class); 

    private MongoClient mongoClient; 

    private final AppProperties properties; 

    @Autowired 
    public MongoService(AppProperties properties) { 
     this.properties = properties; 
    } 

    /** 
    * Open connection 
    */ 
    public void openConnection() { 

     try { 
      mongoClient = new MongoClient(new MongoClientURI(properties.getMongoConnectionString())); 
     } catch (Exception e) { 
      logger.error("Cannot create connection to Search&Browse database", e); 
      throw new BackendException("Cannot create connection to Search&Browse database"); 
     } 
    } 

} 

Wenn es von der Steuerung aufgerufen wird mit SpringApplication.run gestartet(), die MongoService nicht null ist, aber, wenn ich von einem jUnit versuchen, es funktioniert nicht.

Also, ich versuche dies:

@RunWith(SpringRunner.class) 
@SpringBootTest 
@ContextConfiguration(classes = AppProperties.class) 
public class MongoServiceTest { 

    private static final Logger logger = LoggerFactory.getLogger(MongoServiceTest.class); 

    @Autowired 
    MongoService mongoService; 

    @Test 
    public void MongoServiceAutowired() { 
     assertNotNull(mongoService); 
    } 
} 

aber ich bin immer diese Ausnahme:

org.springframework.beans.factory.UnsatisfiedDependencyException: Fehler Bean mit dem Namen zu schaffen ‚mypackage.MongoServiceTest ': Unbefriedigte Abhängigkeit ausgedrückt durch Feld' mongoService '; verschachtelte Ausnahme ist org.springframework.beans.factory.NoSuchBeanDefinitionException: Keine berechtigende Bean vom Typ 'mypackage.services.mongo.MongoService' verfügbar: erwartete mindestens 1 Bean, die sich als Autowire-Kandidat qualifiziert. Abhängigkeitsanmerkungen: {@ org.springframework.beans.factory.annotation.Autowired (erforderlich = wahr)}

Irgendwelche Anhaltspunkte? Wo versage ich?

+0

'@ SpringBootTest' sucht nach einer' @ SpringBootApplication', die sich auf der Stammebene des Projekts befinden muss (weil sie rekursiv nach Spring Komponenten/Konfigurationen sucht) [oder anderweitig anzugeben, wo nach '@ComponentScan gesucht werden soll ']. Ist das der Fall? – DerM

+0

Ich habe den @ComponentScan hinzugefügt, aber ohne Erfolg (jUnits sind im Ordner/test gespeichert) –

Antwort

1

Ich gehe davon aus, dass Ihre AppProperties und MongoService ist nicht im selben Paket

Wenn nicht Sie MongoService auf diese Weise injizieren:

eine andere Klasse erstellen namens TestConfiguration

@ComponentScan(basePackageClasses = { 
     MongoService.class, 
     AppProperties.class 
}) 
@SpringBootApplication 
public class TestConfiguration { 
    public static void main(String[] args) { 
     SpringApplication.run(TestConfiguration.class, args); 
    } 
} 

Und in der test einfach ändern zu:

@RunWith(SpringRunner.class) 
@SpringBootTest(classes = TestConfiguration.class) 
public class MongoServiceTest { 

    private static final Logger logger = LoggerFactory.getLogger(MongoServiceTest.class); 

    @Autowired 
    MongoService mongoService; 

    @Test 
    public void MongoServiceAutowired() { 
     assertNotNull(mongoService); 
    } 
} 
Verwandte Themen