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 {
}
avez-vous l'annotation '@ EnableJpaRepositories' dans votre classe' @ Configuration'? –
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
@mp_loki J'ai ajouté les EnableJpaRepositories d'annotation, voir mon modifier dans la question – progonkpa