【发布时间】:2017-08-02 20:58:09
【问题描述】:
我正在尝试编写集成测试,但在测试中自动装配存储库时遇到问题。
我收到此异常: org.springframework.beans.BeanInstantiationException: 无法实例化 [org.observer.media.repository.ArticleRepository]: 指定的类是一个接口。
编辑:
我用@EnableJpaRepositories 添加了PersistenceConfig.class,代码如下。这导致异常org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'entityManagerFactory' available
我还尝试在 @SpringBootTest(classes = {} 中添加 Application.class 以尝试全部捕获但抛出 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(配置类只包含域类的bean):
@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 {
}
【问题讨论】:
-
你的
@Configuration类中有@EnableJpaRepositories注释吗? -
在这段代码中没有明确定义。不过,我已经尝试过该注释,并在那一刻得出结论,它不是罪魁祸首,并认为该注释包含在 SpringBootTest 注释中。不过我可能错了,稍后当我把代码放在我面前时,我会把注释放回去。我相信它然后抱怨没有我认为应该由 Spring Boot 自动配置的 EntityManagerFactory。然后我提供了一个带有数据源和 emf 等的配置,然后它又回到了与这篇文章中相同的错误。
-
@mp_loki 我添加了注解 EnableJpaRepositories,在问题中查看我的编辑
标签: java testing spring-boot repository autowired