在 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的主要内容,如果未能解决你的问题,请参考以下文章
用于 Spring Boot 应用程序的 JUnit @BeforeClass 非静态工作
我需要我的 Spring Boot Web 应用程序在 JUnit 中重新启动