如何在使用 Spring Boot 的集成测试中自动连接存储库?



我正在尝试编写集成测试,但在测试中自动连接存储库时遇到问题。

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

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

我还尝试在 @SpringBootTest(类 = {} 中添加 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@SpringBootTest

我从这里修改了原始示例以使用@SpringBootTest注释。 因此,以下配置有效:

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

请注意@ComponentScan注释。 然后在我的测试中:

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

它做了一个把戏。您可以尝试在示例中执行相同的操作。

我有同样的异常org.springframework.beans.BeanInstantiationException:无法实例化[...]:指定的类是我的集成测试中的一个接口。 我在不使用 PersistenceConfig 的情况下进行了解析.class但只更改了我的集成类中使用的错误注释。我使用了以下注释: @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE( 因为我不想使用内存数据库。

您的代码可能如下所示:

@ComponentScan(basePackages = {"org.observer"})
@RunWith(SpringRunner.class)
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@DataJpaTest
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);
}

也许你可以尝试@AutoConfigureDataJpa@AutoConfigureXxx注释。

最新更新