我正在开发一个使用 Spring Boot 2 和 Spring Data JDBC 的应用程序。最终的应用程序将使用 MySQL。
我目前有一个持久层和一个服务层以及一些从 CrudRepository 派生的存储库。
对于我的单元测试,我真的想在没有任何数据库的情况下进行单元测试。甚至没有 HSQL。我知道这里有几种不同的哲学可以订阅,但我想切换到纯单元测试,看看它是如何发挥作用的。我将在集成测试中使用数据库。
我的application.properties
测试文件夹中有一个单独的文件夹,其中我有一个单独的测试配置。
如果没有定义数据源,Spring Boot 将默认使用 HSQL application.properties
。但同样,我想在没有任何数据库的情况下运行我的测试,并且只模拟我的 CrudRepository 实现。我尝试通过在我的以下内容中使用不同的变体来禁用 Spring Boot 的数据库自动配置application.properties
:
spring.autoconfigure.exclude= \
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.data.jdbc.JdbcRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration
在我的测试中,我试图做这样的事情:
@ExtendWith(SpringExtension.class)
@Transactional
@SpringBootTest
public class UserServiceTest {
private UserService userService;
@MockBean
private UserRepository userRepository;
@BeforeEach
void setUp() {
userService = new UserService(userRepository);
}
@Test
public void doSomeTest() {
// Test code goes here
}
}
我在服务中使用基于构造函数的依赖注入。但是,我从 Spring 收到如下错误:
org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'package.userRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
我想要的是一个模拟的 userRepository,我可以在其中预先配置一个伪造的存储库以返回虚拟数据。但似乎删除数据库配置会完全删除 CrudRepository,因此 spring boot 应用程序的任何部分都无法启动。还是我错过了其他东西。
我正在使用 Eclipse、Maven、Mockito 和 JUnit5。我应该注意,如果我对测试 mysql 数据库运行“单元测试”,那么一切正常,所以我知道代码或测试或一般设置没有任何问题。问题仅在我想摆脱数据库时才开始。
我是一名初级 Java 开发人员,这样做是为了好玩,所以我可能会遗漏一些明显的东西。在网上搜索 Spring Data JDBC 很困难,因为我几乎只找到与 JPA 相关的解决方案。