一种极简单的SpringBoot单元测试方法| 京东零售技术团队
前言
本文主要提供了一种单元测试方法,力求0基础人员可以从本文中受到启发,可以搭建一套好用的单元测试环境,并能切实的提高交付代码的质量。极简体现在除了POM依赖和单元测试类之外,其他什么都不需要引入,只需要一个本地能启动的springboot项目。
目录
1.POM依赖
2.单元测试类示例及注解释义
3.单元测试经验总结
一、POM依赖
Springboot版本: 2.6.6
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>3.12.4</version>
</dependency>
二、单元测试类示例
主要有两种
第一种,偏集成测试
需要启动项目,需要连接数据库、RPC注册中心等
主要注解:@SpringBootTest + @RunWith(SpringRunner.class) + @Transactional + @Resource + @SpyBean + @Test
•@SpringBootTest + @RunWith(SpringRunner.class) 启动了一套springboot的测试环境;
•@Transactional 对于一些修改数据库的操作,会执行回滚,能测试执行sql,但是又不会真正的修改测试库的数据;
•@Resource 主要引入被测试的类
•@SpyBean springboot环境下mock依赖的bean,可以搭配Mockito.doAnswer(…).when(xxServiceImpl).xxMethod(any())mock特定方法的返回值;
•@Test 标识一个测试方法
TIP:对于打桩有这几个注解@Mock @Spy @MockBean @SpyBean,每一个都有其对应的搭配,简单说@Mock和@Spy要搭配@InjectMocks去使用,@MockBean和@SpyBean搭配@SpringBootTest + @RunWith(SpringRunner.class)使用,@InjectMocks不用启动应用,它启动了一个完全隔离的测试环境,无法使用spring提供的所有bean,所有的依赖都需要被mock
上代码:
/**
* @author jiangbo8
* @since 2024/4/24 9:52
*/
@Transactional
@SpringBootTest
@RunWith(SpringRunner.class)
public class SalesAmountPlanControllerAppTest {
@Resource
private SalesAmountPlanController salesAmountPlanController;
@SpyBean
private ISaleAmountHourHistoryService saleAmountHourHistoryServiceImpl;
@SpyBean
private ISaleAmountHourForecastService saleAmountHourForecastServiceImpl;
@SpyBean
private ISaleAmountHourPlanService saleAmountHourPlanServiceImpl;
@Test
public void testGraph1() {
// 不写mock就走实际调用
SalesAmountDTO dto = new SalesAmountDTO();
dto.setDeptId1List(Lists.newArrayList(35));
dto.setDeptId2List(Lists.newArrayList(235));
dto.setDeptId3List(Lists.newArrayList(100));
dto.setYoyType(YoyTypeEnum.SOLAR