首页 > 解决方案 > 在 Spring Boot 中进行测试时跳过与 mysql 的数据库连接

问题描述

我在我的 Spring Boot 项目中使用以下依赖项(在 gradle 中)以使其与 mysql 一起使用

    compile("org.springframework.boot:spring-boot-starter-data-jpa:${springBootCloudVersion}")

并在我的 application.properties 文件中提供了 Datasource 设置:-

spring.datasource.url=jdbc:mysql://127.0.0.1/test?zeroDateTimeBehavior=convertToNull
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

它运行良好。

在 Spring Boot 中执行测试用例时,我想跳过使用 mysql 创建数据库连接,因为我没有从数据库中得到任何东西,而是我已经模拟了(使用 mockito),这是正确的方法。

我在 google 和 stackoverflow 上进行了搜索,但找不到关于“如何在执行测试用例时跳过创建数据库连接”的解决方案。

有人可以帮我解决这个问题或指导吗

我的测试文件:-

package com.myproject.utility.services.impl;

@RunWith(SpringRunner.class)
@SpringBootTest
@ActiveProfiles("test")    
public class UserServicesImplTest {
  private static final String MOBILE = "123456";

  @MockBean
  private UserRepository userRepository;

  @Autowired
  private UserService userService;

  @Test
  public void verify(){
    when(userRepository.findAll().thenReturn(Optional.empty());
    userService.verifyDetails(MOBILE);
  }
}

标签: spring-bootgradlespring-data-jpabuild.gradlespring-test

解决方案


您应该提供一个“测试配置”,您可以将其放置在您的测试类中,然后 Spring 将使用它而不是生产配置:

@RunWith(SpringRunner.class)
@SpringBootTest    
public class UserServicesImplTest {

  private static final String MOBILE = "123456";

  @MockBean private UserRepository userRepository;
  @Autowired private UserService userService;

  @Test
  public void verify(){
    when(userRepository.findAll().thenReturn(Optional.empty());
    userService.verifyDetails(MOBILE);
  }

  @Configuration
  @Import(UserService.class)
  static class TestConfig {
    @Bean
    UserRepository userRepository() {
      return mock(UserRepository.class);
    }
  }
}

更多信息在这里:检测测试配置


推荐阅读