没有数据库连接的 Spring Boot 测试

Posted

技术标签:

【中文标题】没有数据库连接的 Spring Boot 测试【英文标题】:Spring boot test without database connection 【发布时间】:2020-07-23 19:39:16 【问题描述】:

起初我的测试类上方有以下注释:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
@AutoConfigureMockMvc

使用该配置,它会尝试连接到我的数据库,如果我的数据库未运行,则会出现此错误:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)

我希望我的测试在没有任何数据库连接的情况下运行,这就是我尝试更改注释的原因,所以我的测试类现在看起来像这样:

@RunWith(SpringRunner.class)
@DataJpaTest
@WebMvcTest(CitizenController.class)
@AutoConfigureMockMvc
public class CitizenControllerTest 

@Autowired
private MockMvc mockMvc;

@MockBean
private CitizenRepository citizenRepository;

@MockBean
private WeeklyCareRepository weeklyCareRepository;

@MockBean
private SubCategoryCareRepository subCategoryCareRepository;

@Autowired
private ObjectMapper objectMapper;

private static List<Citizen> mockCitizenList;

private String citizenJson;

但是,我现在遇到另一个错误:

java.lang.IllegalStateException: Configuration error: found multiple declarations of @BootstrapWith for test class [controllers.CitizenControllerTest]: [@org.springframework.test.context.BootstrapWith(value=class org.springframework.boot.test.context.SpringBootTestContextBootstrapper), @org.springframework.test.context.BootstrapWith(value=class org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTestContextBootstrapper)]

是否可以在没有数据库连接的情况下运行我的测试?如果是这样,我做错了什么/错过了什么?

【问题讨论】:

***.com/a/39869110/643500 @HithamS.AlQadheeb 使用@SpringBootTest 对我不起作用,因为它给了我jdbc4.CommunicationsException: Communications link failure 【参考方案1】:

@SpringBootTest 注解开始Spring Context

删除@SpringBootTest注解将无法连接数据库

【讨论】:

【参考方案2】:

您可以在 @Test 方法中模拟将连接到存储库类中的数据库的方法。

@SpringBootTest
@AutoConfigureMockMvc
class StoreApplicationTests 

    @Autowired
    private MockMvc mockMvc;

    @MockBean
    private CitizenRepository citizenRepository;


    @Test
    void contextLoads() 
    

    @Test
    public void test() 

        Mockito.when(citizenRepository.getDataFromDB()).thenReturn("Something you'd like to Return");

    


完成后,citizenRepository.getDataFromDB() 在被调用时将不会连接到数据库。


评论后更新:

然后您可以创建“src/test/resources”并将您的 application.properties 或 application.yml 从“src/main/resources”复制到该目录并注释 mysql 连接部分。

如果你没有“src/test/resources/application.properties”,那么spring会默认读取“src/main/resources/application.properties”并根据该文件配置项目,因为你有里面有datasource配置,spring会尝试连接数据库,如果数据库服务器宕机了,就会失败。

【讨论】:

首先,如果我删除@RunWith(SpringRunner.class),自动装配的bean 似乎为空。其次,我已经模拟了我的数据库方法。似乎它永远不会到达它将执行它们的部分,因为我在尝试运行测试时几乎立即得到jdbc4.CommunicationsException: Communications link failure 更新答案。 是的,我最终创建了一个新的正在测试的 application.properties,并在其中配置了一个 H2 内存数据库。这解决了我的问题。 很高兴知道!顺便说一句,接受永远是最大的鼓励,谢谢!

以上是关于没有数据库连接的 Spring Boot 测试的主要内容,如果未能解决你的问题,请参考以下文章

测试 Spring Boot 中使用的 HSQLDB 连接

在 spring-boot 集成测试中使用 H2 数据库的 JDBC 连接错误

单元测试 Spring Boot 应用服务层

Spring boot、ElasticSearch 和 TestContainers 集成测试。拒绝连接

spring boot 2 - 数据访问单元测试指标监控原理解析

Spring Boot / Spring数据集成测试