1

我的 Springboot 应用程序工作正常,它连接到数据源。对于 Junit,我通过排除 DatasourceAutoConfiguration、DataSourceTransactionManagerConfiguration、HibernateJpaAutoConfiguration 类来禁用数据源的自动配置,以避免 SpringBoot 自动配置数据源。

pom.xml

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-test</artifactId>
  <scope>test</scope>
<dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-jpa</artifactId>
  <version>2.2.5.RELEASE</version>
<dependency>
<dependency>
  <groupId>com.microsoft.sqlserver</groupId>
  <artifactId>mssql-jdbc</artifactId>
  <version>8.2.2.jre8</version>
<dependency>

主班

@SpringBootApplication
@EnableAutoConfiguration
@ComponentScan({"com.basepackage"})
public class SampleClass{
  psvm(){
  SpringApplication.run(SampleClass.class,args);
}
}

JuniTestClass

@RunWith(SpringRunner.class)
@SpringBootTest(classes=SampleClass.class)
@AutoConfigureMockMvc
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class, DataSourceTransactionManagerConfiguration.class, HibernateJpaAutoConfiguration.class})
public class SampleControllerTest {
  @MockBean
  private SampleService service;

  @Test
  public void fetchUsers() {
    Mockito.when(service.retrieveUsers().thenReturn(new SampleResponse());
}

}

在 mvn 测试中,测试脚本运行但失败,因为 Springboot 没有自动配置 SampleRepository bean(可能是因为排除了 Datasource 和 HibernateJpa 自动配置类)

错误

Caused by UnsatisfiedDependencyException: Error creating bean with name ServiceDAOImpl, nested exception No qualifying bean of type com.basepackage.repository.SampleRepository' : expected atleast 1 bean which qualifies ...................

如果我删除 AutoConfig Exclusion,Junit 测试在配置数据源的本地工作区中工作正常(尽管不应建立与 DB 的 JUnit 连接)。问题是我正在设置 devops 管道,并且在“Maven 测试”期间,SpringBoot 自动配置数据源并且到 Jenkins 到数据库的连接失败。

我想在 Junit - Maven 测试和实际 SpringBoot jar 构建期间禁用自动配置,应该启用自动配置。

有人可以让我知道如何使用注释来实现这一点吗?

4

1 回答 1

2

禁用数据库的自动配置是一回事,但是您的应用程序类依赖(我猜)来自 Spring Data 的 JPA 存储库(它们使用 注入它@Autowired)来工作。

如果您现在禁用数据库的自动配置,您的 JPA 存储库将无法由 Spring Data 引导,因此您的服务类在启动时会失败,因为它们需要一个可用的实例:... expected at least 1 bean which qualifies.

我想你有三个选择来解决这个问题:

  1. 在测试期间使用Testcontainers提供一个真实的数据库,并再次启用数据相关部分的自动配置。这将是最好的解决方案,因为您可以使用您在生产中使用的相同数据库来测试您的应用程序。
  2. 继续禁用自动配置,但为您的测试提供手动数据源配置:
@SpringBootTest
class ApplicationIntegrationTest {

  @TestConfiguration
  public static class TestConfig {

    @Bean
    public DataSource dataSource() {
      return DataSourceBuilder
        .create()
        .password("YOUR PASSWORD")
        .url("YOUR MSSQL URL")
        .username("YOUR USERNAME")
        .build();
    }
  }
}
  1. 用于@MockBean您的所有存储库。这将允许您在没有任何数据库的情况下完全工作,但您必须使用 Mockito 为自己定义与存储库的任何交互:
@SpringBootTest
class SpringBootStackoverflowApplicationTests {

  @MockBean
  private SampleRepository sampleRepository;
  
  @MockBean
  private OtherRepository otherRepository;
  
  // your tests
}
于 2020-06-29T07:32:01.280 回答