spring boot 做controller层的单元测试
程序员文章站
2022-03-02 18:06:49
...
以前项目做单元测试那不叫单元测试,单元测试中的单元局限在类的方法中,很多数据不应该依赖第三方,应该自己mock数据,否则就应该叫集成测试了,就像如何写好单元测试:Mock脱离数据库+不使用@SpringBootTest
中说的差不多,但是也有差异,建议可以看一看
回归正题,这一篇博客主要讲的是在项目的controller层做单元测试,而且既然是单元测试,肯定像服务就需要mock数据
一、直接看代码,一个小demo
import com.example.demo.controller.TestController;
import com.example.demo.entity.User;
import com.example.demo.service.FirstService;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* @author 孔超
* @date 2021/2/28 21:51
*/
//@SpringBootTest 这个千万不要用,要不就要启动整个web项目
@RunWith(SpringJUnit4ClassRunner.class)
public class TestControllerTest {
//需要mock的服务
@Mock
FirstService firstService;
//上面mock的数据需要注入到哪里
@InjectMocks
TestController testController;
@Test
public void test() {
//准备mock返回的数据
User user = new User();
user.setId(1L);
user.setName("孔超");
user.setAge("16");
//mock服务或者类中的某个方法,当参数是什么时,返回值是什么
Mockito.when(firstService.getUser(1L)).thenReturn(user);
//执行单元测试逻辑
User result = testController.getUser(1L);
//断言
Assert.assertEquals("孔超", result.getName());
}
}
二、controller层代码
@Controller
public class TestController {
@Resource
FirstService firstService;
@RequestMapping(value = "/getUser.do")
public User getUser(Long id) {
return firstService.getUser(id);
}
}
三、需要的依赖
1、@RunWith(SpringJUnit4ClassRunner.class)
需要下面的依赖
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
2、mockito的依赖
spring-boot-starter-test的依赖已经集成了mockito的依赖,可以去里面看看
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
这样一个完整的controller层单元测试就完成了,虽然依然依赖于spring,但是不需要初始化整个web项目,执行速度提升了,数据污染减少了,不像服务可以加事务注解,因为是微服务的,在这加事务注解影响不到服务层。
推荐阅读
-
idea创建一个入门Spring Boot项目(controller层)使用Moven代码管理
-
spring boot的应用程序单元测试方案
-
spring boot的应用程序单元测试方案
-
Spring Boot中集成 Shiro做简单的认证及授权.
-
Spring Boot从Controller层进行单元测试的实现
-
Spring Boot中使用AOP统一处理web层异常的方法
-
Spring Boot 整合 TKMybatis 二次简化持久层代码的实现
-
Spring Boot构建系统安全层的步骤
-
在spring boot的controller层里使用cookie
-
Spring Boot Bean的使用,@Repository,@Service,@Controller,@Component