我可以使用Spring Boot在没有任何数据库的情况下使用Spring Data JDBC模拟CrudRepository吗?

时间:2020-02-19 11:36:17

标签: spring spring-boot mockito spring-data-jdbc

我正在开发一个使用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相关的解决方案。

1 个答案:

答案 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类。

相关问题