我正在开发一个使用Spring Boot 2和Spring Data JDBC的应用程序。最终的应用将使用MySQL。
我目前拥有一个持久层和一个服务层,以及一些来自CrudRepository的存储库。
对于我的单元测试,我想真正地在没有任何数据库的情况下进行单元测试。甚至没有HSQL。我知道在这里可以订阅几种不同的方法,但是我想切换到纯单元测试,看看它如何发挥作用。我将在集成测试中使用数据库。
我的测试文件夹中有一个单独的application.properties
,在我的测试文件夹中有一个单独的配置。
如果application.properties
中未定义任何数据源,Spring Boot将默认为HSQL。但是再次,我想在没有任何数据库的情况下运行测试,而仅模拟我的CrudRepository实现。我尝试通过在application.properties
中使用以下内容的不同变体来禁用Spring Boot的数据库自动配置:
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开发人员,乐于这样做,所以我可能会遗漏一些明显的东西。在Web上搜索Spring Data JDBC非常困难,因为我几乎只能找到与JPA相关的解决方案。
答案 0 :(得分:0)
@SpringBootTest
加载所有上下文。 Spring boot – @SpringBootTest
在后台,@SpringBootTest试图模仿Spring Boot框架添加的用于创建上下文的过程,例如它根据程序包结构决定要扫描的内容,从预定义的位置加载外部配置,还可以选择运行自动配置启动器,等等。
正如我们看到的那样,此注释开始并几乎配置了整个注释 应用程序在测试开始之前,我们应该使用@SpringBootTest 编写使用应用程序流程的集成测试,并 依赖性。
包括UserService
。而且我猜它找不到UserRepository
,所以失败了。
我想您应该删除这些字符串
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)
@SpringBootTest
@Transactional
public class UserServiceTest {
@TestConfiguration
class UserServiceTestContextConfiguration {
@Bean
public UserService userService() {
return new UserService(userRepository);
}
}
@Autowired
private UserService userService;
@MockBean
private UserRepository userRepository;
// write test cases here
}
我拿了it from here
请记住,Spring是专门处理@TestConfiguration
的,所以不要Spring boot – @TestConfiguration
在春季启动中,任何通过@TestConfiguration注释的顶级类中配置的bean都不会通过组件扫描获得。我们必须向包含测试用例的类显式注册@TestConfiguration类。