mercredi 2 août 2017

How autowire a repository in an integration test with Spring Boot?

ScraperRunner put some scrapers to work that scrape articles. ScraperRunner will then use a repository to save the articles to the database. I'm trying to write an integration test for this but I'm having trouble with autowiring the repository in the test.

I receive this exception: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.observer.media.repository.ArticleRepository]: Specified class is an interface.

ScraperRunnerIntegrationTest (the config classes only contain beans of domain classes):

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = {
        ApplicationConfig.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);
}

Aucun commentaire:

Enregistrer un commentaire