jac*_*ack 2 junit spring-boot spring-boot-test spring-autoconfiguration
我的 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>
Run Code Online (Sandbox Code Playgroud)
主班
@SpringBootApplication
@EnableAutoConfiguration
@ComponentScan({"com.basepackage"})
public class SampleClass{
psvm(){
SpringApplication.run(SampleClass.class,args);
}
}
Run Code Online (Sandbox Code Playgroud)
Juni测试班
@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());
}
Run Code Online (Sandbox Code Playgroud)
}
在 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 ...................
Run Code Online (Sandbox Code Playgroud)
如果我删除 AutoConfig 排除,Junit 测试在配置数据源的本地工作区中可以正常工作(尽管不应建立与 DB 的 JUnit 连接)。问题是我正在设置 devops 管道,并且在“Maven 测试”期间,SpringBoot 自动配置数据源,并且 Jenkins 与数据库的连接失败。
我想在 Junit - Maven 测试期间禁用自动配置,并且在实际的 SpringBoot jar 构建中,应该启用自动配置。
有人可以让我知道如何使用注释来实现这一目标吗?
禁用数据库的自动配置是一回事,但您的应用程序类依赖(我猜)来自 Spring Data 的 JPA 存储库(它们使用注入它@Autowired)来工作。
如果您现在禁用数据库的自动配置,您的 JPA 存储库将无法由 Spring Data 引导,因此您的服务类在启动时会失败,因为它们需要可用的实例:... expected at least 1 bean which qualifies。
我想你有三种选择来解决这个问题:
@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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
@MockBean您的所有存储库。这将允许您完全在没有任何数据库的情况下工作,但您必须使用 Mockito 自己定义与存储库的任何交互:@SpringBootTest
class SpringBootStackoverflowApplicationTests {
@MockBean
private SampleRepository sampleRepository;
@MockBean
private OtherRepository otherRepository;
// your tests
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2968 次 |
| 最近记录: |