2017-08-02 2 views
0

J'essaie d'écrire un test d'intégration mais j'ai des problèmes avec l'autowiring du référentiel dans le test.Comment autowire un référentiel dans un test d'intégration avec Spring Boot?

Je reçois cette exception: org.springframework.beans.BeanInstantiationException: Impossible d'instancier [org.observer.media.repository.ArticleRepository]: classe spécifiée est une interface.

Editer: J'ai ajouté PersistenceConfig.class avec @EnableJpaRepositories, code ci-dessous. Il en résulte Exception org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'entityManagerFactory' available

J'ai aussi essayé d'ajouter Application.class dans @SpringBootTest (classe = {} dans un fourre-tout tentative, mais qui jette Error creating bean with name 'articleRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Not a managed type: class org.observer.media.model.Article

ScraperRunnerIntegrationTest (les classes de configuration ne contiennent que des haricots de classes de domaine) :

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringBootTest(classes = { 
     ApplicationConfig.class, 
     PersistenceConfig.class, 
     DeMorgenTestConfig.class, 
     Article.class, 
     ScraperRunner.class, 
     DeMorgenWebsiteScraper.class, 
     ArticleService.class, 
     DeMorgenPageScraper.class, 
     JsoupParser.class, 
     DeMorgenArticleScraper.class, 
     GenericArticleScraper.class, 
     ImageMetaScraper.class, 
     ArticlePrinter.class, 
     ArticleRepository.class 
}) 
public class ScraperRunnerIntegrationTest { 

    private final static Article EXPECTED_ARTICLE_1 = anArticle().withHeadline("headline1").build(); 
    private final static Article EXPECTED_ARTICLE_2 = anArticle().withHeadline("headline2").build(); 

    @Autowired 
    private ScraperRunner scraperRunner; 
    @Autowired 
    private DeMorgenWebsiteScraper deMorgenWebsiteScraper; 

    @Autowired 
    private ArticleRepository articleRepository; 

    @Test 
    public void run() { 
     scraperRunner.run(deMorgenWebsiteScraper); 

     assertThat(articleRepository.findAll()).containsOnly(EXPECTED_ARTICLE_1, EXPECTED_ARTICLE_2); 
    } 

Repository:

import org.observer.media.model.Article; 
import org.springframework.data.jpa.repository.JpaRepository; 
import org.springframework.data.jpa.repository.Query; 
import org.springframework.data.repository.query.Param; 
import org.springframework.stereotype.Repository; 

import java.util.List; 

@Repository 
public interface ArticleRepository extends JpaRepository<Article, Long> { 

    List<Article> findAll(); 

    Article findByHash(String hash); 

    Article findByHeadline(String headline); 

    List<Article> findArticleByHeadlineAndCompanyName(String headline, String companyName); 

    @Query("SELECT CASE WHEN COUNT(a) > 0 THEN true ELSE false END FROM Article a WHERE a.hash = :hash") 
    boolean existsByHash(@Param("hash") String hash); 
} 

PersistenceConfig.class:

package org.observer.media.config; 

import org.springframework.context.annotation.Configuration; 
import org.springframework.data.jpa.repository.config.EnableJpaRepositories; 

@Configuration 
@EnableJpaRepositories("org.observer.media.repository") 
public class PersistenceConfig { 
} 
+0

avez-vous l'annotation '@ EnableJpaRepositories' dans votre classe' @ Configuration'? –

+0

Dans ce code, il n'est pas défini explicitement. J'ai essayé cette annotation et j'ai conclu à ce moment-là que ce n'était pas le coupable et j'ai pensé que l'annotation était incluse dans l'annotation SpringBootTest. Je peux me tromper à ce sujet et je mettrai l'annotation quand j'aurai le code devant moi plus tard. Je crois qu'il s'est alors plaint de ne pas avoir un EntityManagerFactory qui aurait dû être configuré automatiquement par Spring Boot je pense. Ensuite, j'ai fourni une config avec datasource et emf etc et puis il est revenu à la même erreur que dans ce post. – progonkpa

+0

@mp_loki J'ai ajouté les EnableJpaRepositories d'annotation, voir mon modifier dans la question – progonkpa

Répondre

1

Vous devez fournir uniquement les classes, annotées @Configuration-@SpringBootTest. J'ai modifié l'exemple original de here pour utiliser l'annotation @SpringBootTest. Ainsi, la configuration suivante fonctionne:

@Configuration 
@ComponentScan("hello") 
public class AppConfig { 

} 

Notez l'annotation @ComponentScan. Et puis dans mon test:

@RunWith(SpringRunner.class) 
@SpringBootTest(classes={AppConfig.class}) 
public class CustomerRepositoryTests { 
    @Autowired 
    private CustomerRepository customerRepository; 
} 

Et il a fait un tour. Vous pouvez essayer de faire la même chose dans votre exemple.

+0

j'ai essayé votre suggestion mais lancers francs par: org.springframework.context.annotation.ConflictingBeanDefinitionException: Nom haricot Annotation spécifié « propertyPlaceholderAutoConfiguration » pour la classe de haricot [org. springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration] est en conflit avec la définition de bean existante, non compatible, de même nom et classe [org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration] – progonkpa

+0

Il y a quelque chose de fâché avec votre configuration, et sans tout voir Je ne peux pas raisonner sur quoi exactement. Je vous suggère d'essayer avec une configuration aussi simple que possible et ensuite commencer à ajouter des choses une par une. Ou postez votre projet sur GitHub (si cela est possible et n'enfreignez aucun NDA) et partagez un lien ici. –

+0

Avec SpringBootTest seul, sans les classes {...} fonctionne: il charge l'applicationContext complet, les dépôts inclus.Lors de l'utilisation des classes {}, seule une petite partie du contexte est chargée, ce qui est plus léger, mais les dépôts ne sont pas disponibles. Cela a soulevé un nouveau problème: autowire testdependencies dans les beans pour un test d'intégration. Maintenant, il autowires tout ensemble comme si c'était une course normale. J'ai essayé des profils qui n'ont pas fonctionné mais c'est une autre question. J'ai une usine en place maintenant qui crée la dépendance de test parce que je ne peux plus faire face au printemps pour aujourd'hui :) – progonkpa