2017-08-02 34 views
0

我正在尝试编写集成测试,但在测试中自动装配存储库时遇到问题。如何在Spring Boot的集成测试中自动连接存储库?

我收到此异常: org.springframework.beans.BeanInstantiationException:无法实例化[org.observer.media.repository.ArticleRepository]:指定的类是一个接口。

编辑: 我在@EnableJpaRepositories中添加了PersistenceConfig.class,代码如下。这导致异常org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'entityManagerFactory' available

我也尝试添加Application.class在@SpringBootTest(类= {}在包罗万象的尝试,但抛出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(在配置类仅包含域类的豆) :

@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); 
    } 

库:

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

你有@ @ EnableJpaRepositories'注释在你的'@ Configuration'类吗? –

+0

在此代码中没有明确定义。我已经尝试了这个注释,并在那一刻得出结论,它不是罪魁祸首,并且认为注释包含在SpringBootTest注解中。我可能是错的,但是当我在后面的代码在我面前时,会将注释放回原处。我相信它然后抱怨没有应该由Spring Boot自动配置的EntityManagerFactory我认为。然后我提供了一个配置数据源和emf等,然后它回到了同样的错误,在这篇文章中。 – progonkpa

+0

@mp_loki我添加了注释EnableJpaRepositories,请参阅我在编辑 – progonkpa

回答

1

您只需提供类别,注释为@Configuration@SpringBootTest

我已将原始示例从here修改为使用@SpringBootTest注释。 所以下面的配置工作:

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

} 

注意@ComponentScan注解。 然后在我的测试:

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

它做到了一招。你可以尝试在你的例子中做同样的事情。

+0

中的编辑我尝试了您的建议,但是引发了:org.springframework.context.annotation.ConflictingBeanDefinitionException:注释指定的bean名称propertyPlaceholderAutoConfiguration for bean class [org。 springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration]与现有的,具有相同名称和类的非兼容bean定义冲突[org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration] – progonkpa

+0

有些东西与您的配置混淆,并且没有看到它全部我不知道究竟是什么。我建议你尝试尽可能简单的配置,然后开始逐一添加。或者将您的项目发布到GitHub(如果可能且不违反任何NDA)并在此共享链接。 –

+0

单独使用SpringBootTest,没有类{...}工作:它会加载完整的applicationContext,包括存储库。使用类{}时,只会加载一小部分上下文,这更加精简,但存储库不会通过。这引发了一个新问题:在集成测试中,自动测试beans中的testdependencies。现在它将所有东西自动装配在一起,就像它正常运行的地方一样。我试过的档案没有用,但这是另一个问题。我现在有一个工厂可以创建测试依赖项,因为我今天不能再处理Spring了:) – progonkpa

相关问题