在 Spring Boot 应用程序的 JUnit 测试中,自动装配的 JPA 存储库没有合格的 bean

Posted

技术标签:

【中文标题】在 Spring Boot 应用程序的 JUnit 测试中,自动装配的 JPA 存储库没有合格的 bean【英文标题】:No qualifying bean for autowired JPA repository in JUnit test in Spring Boot application 【发布时间】:2019-11-14 00:27:03 【问题描述】:

我有几个扩展JpaRepository 的存储库。现在我想使用 H2 数据库的真实实例(不在内存中 - 以便我可以使用 Web 控制台检查数据库)来测试我在单元测试中添加的自定义查询。

但是,自动连接单元中的存储库不起作用,我总是得到一个NoSuchBeanDefinitionException: No qualifying bean of type ... UserRepository available

存储库和单元测试的代码如下所示。感谢您的帮助!

用户存储库

public interface UserRepository extends JpaRepository<User, Long> 

用户存储库测试

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
@ContextConfiguration(classes = TestConfiguration.class)
@Transactional
public class UserRepositoryTests 

    @Autowired
    private UserRepository userRepository;

    @Test
    @Commit
    public void test() throws AESEncryptionException 
        User user = new User().setFirstName("ABC").setLastName("XYZ");
        user = userRepository.save(user);
        assertNotNull(user.getId());
    


测试配置

@Configuration
@EnableAutoConfiguration
@ComponentScan
@PropertySource("classpath:/application.properties")
public class TestConfiguration 

应用程序.properties

spring.datasource.url = jdbc:h2:file:./db/app-data
spring.datasource.driverClassName = org.h2.Driver
spring.jpa.database-platform = org.hibernate.dialect.H2Dialect
spring.jpa.hibernate.ddl-auto = update
spring.h2.console.settings.web-allow-others = true

编辑: 正如 Mensur Qulami 所建议的那样,删除 @ContextConfiguration(classes = TestConfiguration.class) 就行了,因为 @SpringBootTest 已经涵盖了这一点。

【问题讨论】:

包含TestConfiguration 的包是否也包含UserRepository 类?因为,如果我没记错的话,@ComponentScan 默认是从它的基类开始的。 不,谢谢您的提示。我指定了@ComponentScan 注释的basePackages 参数。但是现在实际的测试没有执行...... . 你能分享一下当前的错误吗? 没有错误,日志只是Finished Spring Data repository scanning in 16ms. Found 2 repository interfaces.,JUnit测试甚至没有开始。 改名UserRepository,我想Spring已经有了。或者您可以使用 @Qualifier 为您的 bean 提供另一个名称,因为它表示有多个接口可用 【参考方案1】:

您可以将 DataJpaTest@AutoConfigureTestDatabase(replace=Replace.NONE) 结合使用来使用您的“真实”数据库

@RunWith(SpringRunner.class)
@DataJpaTest (showSql = true )
@AutoConfigureTestDatabase(replace=Replace.NONE)
public class UserRepositoryTests 

    @Autowired
    private UserRepository userRepository;

    ....

【讨论】:

试过了,但是现在没有执行测试,最后显示的日志是Finished Spring Data repository scanning in 16ms. Found 2 repository interfaces.,然后什么也没有发生。 确实应该可以,我想还有其他一些配置问题。

以上是关于在 Spring Boot 应用程序的 JUnit 测试中,自动装配的 JPA 存储库没有合格的 bean的主要内容,如果未能解决你的问题,请参考以下文章

JUnit 测试 MongoDB Spring Boot

用于 Spring Boot 应用程序的 JUnit @BeforeClass 非静态工作

Spring Boot junit测试安全应用程序

我需要我的 Spring Boot Web 应用程序在 JUnit 中重新启动

无法从 JUnit 中的 Spring Boot 读取应用程序属性?

如何在 Spring Boot 和 JUnit 测试中定义 spring.config.location?