SpringBoot中@Test的介绍和使用案例

 更新时间:2023年08月21日 10:53:55   作者:fking86  
SpringBoot提供了方便的测试功能,可以很容易地进行单元测试和集成测试,这篇文章主要介绍了SpringBoot中@Test的介绍和使用,需要的朋友可以参考下

SpringBoot Test介绍

SpringBoot提供了方便的测试功能,可以很容易地进行单元测试和集成测试。主要包含以下几点:

  • Spring Boot提供了@SpringBootTest注解,可以用来启动Spring Boot应用,进行集成测试。
  • Spring Boot提供了@MockBean注解,可以用来 Mock Bean。
  • Spring Boot提供了@SpyBean注解,可以用来 Spy Bean。
  • Spring Boot提供了@SpringBootConfiguration注解,可以用来声明配置类。
  • Spring Boot提供了AssertJ的支持,可以用来进行断言。
  • Spring Boot提供了测试相关的工具类,如TestRestTemplate等。
  • SpringBoot提供了@LocalServerPort可以非常方便的模拟客户端,对运行的服务进行端到端集成测试
  • SpringBoot提供了自动配置MockMvc,方便在测试类中直接注入并使用MockMvc

依赖

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-test</artifactId>
  <scope>test</scope>
</dependency>

常用注解

@SpringBootTest

这个注解用来进行集成测试,会启动整个Spring Boot应用,进行端到端测试。

用法:

@SpringBootTest
public class MyTest {
  // 测试方法
}

可以通过webEnvironment参数来指定测试环境:

  • MOCK:加载Web Application Context,不启动Servlet容器。
  • RANDOM_PORT:加载Servlet容器,使用随机端口。
  • DEFINED_PORT:加载Servlet容器,使用定义好的端口。
  • NONE:加载Web Application Context,但是不启动Servlet容器。

@WebMvcTest

这个注解用来测试Web层,会自动注入Web层的Bean,不会启动整个Spring Boot应用。

用法:

@WebMvcTest(UserController.class)
public class MyTest {
  @Autowired
  private MockMvc mvc;
  // 测试方法
}

@DataJpaTest

这个注解用来测试JPA相关的Bean,会自动配置Spring Data JPA相关的Bean。

用法:

code@DataJpaTest
public class MyTest {
  @Autowired
  private TestEntityManager entityManager;
  @Autowired
  private UserRepository userRepository;
  // 测试方法
}

@MockBean

这个注解用来Mock一个Bean,注入测试类中,用来Isolation测试。

用法:

@SpringBootTest
public class MyTest {
  @MockBean
  private UserService userService;
  // 测试方法
}

@SpyBean

这个注解用来Spy一个Bean,注入测试类中,不影响真正的Bean。

用法:

@SpringBootTest
public class MyTest {
  @MockBean
  private UserService userService;
  // 测试方法
}

@SpringBootConfiguration

这个注解用来声明配置类,相当于@Configuration。

用法:

@SpringBootConfiguration
public class MyConfig {
  // 配置代码
}

可以用在测试类中加载额外的配置类。

@LocalServerPort

这个是一个非常有用的注解,它可以为测试获取启动的嵌入式服务器实例的实际端口号。

主要作用和用法如下:

自动注入启动的服务器端口号

在测试类中,可以像下面这样使用@LocalServerPort注解:

@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class MyTest {
  @LocalServerPort
  private int port;
  // 测试方法可以使用port变量
}

这样就可以拿到随机分配的端口号。

结合@Value使用

@LocalServerPort也可以和@Value结合使用:

@Value("${local.server.port}")
private int port;

测试端点

有了端口号,可以通过测试端点进行验证:

@Autowired
private TestRestTemplate restTemplate;
@Test
public void test() {
  String body = this.restTemplate.getForObject("http://localhost:" + port + "/hello", String.class);
  assertEquals("Hello World", body);
}

模拟客户端

使用@LocalServerPort可以非常方便的模拟客户端,对运行的服务进行端到端集成测试。

@AutoConfigureMockMvc

这个是Spring Boot提供的一个便捷的注解,可以用来自动配置MockMvc,方便在测试类中直接注入并使用MockMvc。

主要作用如下:

自动注入MockMvc

在测试类中,可以直接注入MockMvc:

@Autowired
private MockMvc mvc;

不需要自己配置MockMvc。

结合@WebMvcTest使用

@AutoConfigureMockMvc经常和@WebMvcTest一起使用,对控制器进行单元测试:

@WebMvcTest
@AutoConfigureMockMvc
public class TestController {
  @Autowired
  private MockMvc mvc;
  @MockBean
  private UserService userService;
  @Test
  public void test() throws Exception {
    // 使用MockMvc进行请求测试
  }
}

模拟HTTP请求

有了MockMvc,可以轻松模拟各种HTTP请求来测试控制器:

// GET
mvc.perform(get("/users"))
  .andExpect(status().isOk()); 
// POST  
mvc.perform(post("/users"))
  .andExpect(status().isCreated());
// 模拟参数
mvc.perform(get("/users").param("name", "test"))
  .andExpect(content().string(containsString("test")));

验证响应

可以通过MockMvc对响应结果进行验证:

mvc.perform(get("/users/1"))
  .andExpect(status().isOk())
  .andExpect(content().contentType(MediaType.APPLICATION_JSON)) 
  .andExpect(jsonPath("$.name").value("Test User")); 

总之,@AutoConfigureMockMvc可以灵活地模拟HTTP请求,并验证响应,使得测试Web层变得非常方便。它通常与@WebMvcTest注解配合使用,为 Spring Boot的测试提供了很大的便利。

到此这篇关于SpringBoot中@Test的介绍和使用的文章就介绍到这了,更多相关SpringBoot @Test使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java发起http请求获取返回的Json对象方法

    java发起http请求获取返回的Json对象方法

    下面小编就为大家分享一篇java发起http请求获取返回的Json对象方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-03-03
  • Apache Hudi异步Clustering部署操作的掌握

    Apache Hudi异步Clustering部署操作的掌握

    这篇文章主要介绍了Apache Hudi异步Clustering部署操作的掌握,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-03-03
  • 如何在java 8 stream表达式实现if/else逻辑

    如何在java 8 stream表达式实现if/else逻辑

    这篇文章主要介绍了如何在java 8 stream表达式实现if/else逻辑,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • Java生成由时间组成的订单号方式

    Java生成由时间组成的订单号方式

    这篇文章主要介绍了Java生成由时间组成的订单号方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • Jmeter多用户并发压力测试过程图解

    Jmeter多用户并发压力测试过程图解

    这篇文章主要介绍了Jmeter多用户并发压力测试过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • Mybatis 查询语句条件为枚举类型时报错的解决

    Mybatis 查询语句条件为枚举类型时报错的解决

    这篇文章主要介绍了Mybatis 查询语句条件为枚举类型时报错的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • SpringBoot集成redis实现分布式锁的示例代码

    SpringBoot集成redis实现分布式锁的示例代码

    这篇文章主要介绍了SpringBoot集成redis实现分布式锁的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • java线程同步操作实例详解

    java线程同步操作实例详解

    这篇文章主要介绍了java线程同步操作,结合实例形式分析了Java线程同步与锁机制相关原理、操作技巧与注意事项,需要的朋友可以参考下
    2018-09-09
  • 基于java实现的ECC加密算法示例

    基于java实现的ECC加密算法示例

    这篇文章主要介绍了基于java实现的ECC加密算法,简单说明了ECC算法的概念、原理,并结合实例形式分析了java实现ECC加密算法的定义与使用技巧,需要的朋友可以参考下
    2017-08-08
  • Java中线程上下文类加载器超详细讲解使用

    Java中线程上下文类加载器超详细讲解使用

    这篇文章主要介绍了Java中线程上下文类加载器,类加载器负责读取Java字节代码,并转换成java.lang.Class类的一个实例的代码模块。本文主要和大家聊聊JVM类加载器ClassLoader的使用,需要的可以了解一下
    2022-12-12

最新评论