Springboot @Test 给Controller接口 写 单元测试

前言


最近有小伙伴问到怎么给 controller的接口写单元测试。

 

单元测试是开发必不可少的一个环节。

既然有人问到了,那我觉得可能不止一个人不会,那就按照惯例,出手。

 

正文


内容:

主要是get 和 post 两种请求方式的接口 的 单元测试写法。

get方式请求   介绍 3种传参:


①@PathVariable
②@RequestParam("id")
③类传参 如 User user

post方式请求  介绍 1种传参:
@RequestBody

@RequestHeader请求头参数添加参数


上代码 :


先看GET方式请求,简单写三个示例接口

    @GetMapping("/getId/{id}")
    public String pathVariableTest(@PathVariable Integer id) {
        return  "id:   "+id;
    }

    @GetMapping("/getId")
    public String requestParamTest( @RequestParam("id") Integer id) {
        return  "id:   "+id;
    }

    @GetMapping("/getUser")
    public String requestParamObjectTest( User user) {
        return  user.toString();
    }

然后我们来针对这三个get请求接口写单元测试

pom.xml 加入测试使用的jar依赖

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <scope>test</scope>
</dependency>

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

创建一个单元测试类 MyControllerTest.java

 代码:

import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.context.web.WebAppConfiguration;


@RunWith(SpringRunner.class)
@SpringBootTest
@WebAppConfiguration
public class MyControllerTest {

    protected Logger logger = LoggerFactory.getLogger(MyControllerTest.class);
}

 写下来开始写 针对controller 的 单元测试代码:

 代码:

    @Autowired
    DoTestController doTestController;

    private MockMvc mockMvc;

    @Before
    public void setup() {
        mockMvc = MockMvcBuilders.standaloneSetup(doTestController).build();
    }

 

首先针对这种场景的GET请求,传入参数的,我们怎么写单测?

 @RequestParam("id")


 代码: 

    @Test
    public void getTest() throws Exception {
        MvcResult mvcResult = mockMvc.perform(
                MockMvcRequestBuilders.get("/getId")
                        .param("id", "123")
        )
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andDo(MockMvcResultHandlers.print())
                .andReturn();
        logger.info("调用返回的结果:{}", mvcResult.getResponse().getContentAsString());
    }

ps: 多个  @RequestParam  就同样 一直 .param即可

示例:

 当然也可以通过map传值,传多个:

 

 跑一下单测看看效果:

 

然后是@PathVariable 传参方式:

 单测写法:

 代码:

    @Test
    public void pathVariableTest() throws Exception {
        Integer id = 888;

        MvcResult mvcResult = mockMvc.perform(
                MockMvcRequestBuilders.get("/getId/" + id)
        )
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andDo(MockMvcResultHandlers.print())
                .andReturn();
        logger.info("调用返回的结果:{}", mvcResult.getResponse().getContentAsString());
    }

 

然后是传类的情景:

  单测写法:

代码:
 

    @Test
    public void getTestObject() throws Exception {

        MvcResult mvcResult = mockMvc.perform(
                MockMvcRequestBuilders.get("/getUser")
                        .param("userId", "123")
                        .param("name", "JCccc")
                        .param("age", "18")
                        .param("userCode", "100244")
                        .contentType(MediaType.APPLICATION_FORM_URLENCODED_VALUE)
        )
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andDo(MockMvcResultHandlers.print())
                .andReturn();
        logger.info("调用返回的结果:{}", mvcResult.getResponse().getContentAsString());

    }

然后看下POST 请求方式的接口 单测写法

 

顺便把请求头参数方式一并写了:

 代码:
 

    @Test
    public void postTest() throws Exception {
        User user = new User();
        user.setUserId(100011L);
        user.setName("JCccc");
        user.setUserCode("100244");
        user.setAge(18);
        String strJson = JSON.toJSONString(user);
        MvcResult mvcResult = mockMvc.perform(
                MockMvcRequestBuilders.post("/getRequestBodyValue")
                        .header("token", "收藏点赞")
                        .accept(MediaType.parseMediaType("application/json;charset=UTF-8"))
                        .contentType(MediaType.APPLICATION_JSON)
                        .content(strJson)
        )
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andDo(MockMvcResultHandlers.print())
                .andReturn();
        logger.info("调用返回的结果:{}", mvcResult.getResponse().getContentAsString());
    }

效果:

 

  • 17
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
单元测试是一种验证程序执行逻辑是否正确的方法,它可以帮助我们确保代码在各种情况下都能正常工作。对于Spring BootController层,我们可以使用单元测试来验证其功能是否正确。首先,我们需要添加测试依赖。 在编单元测试之前,我们可以先创建一个单元测试基础类。这个基础类可以包含一些通用的配置和操作,比如日志记录和测试生命周期的管理。 在具体的Controller类中,我们可以使用@RestController注解来定义一个Controller类,并使用@RequestMapping注解来定义接口路径。在这个例子中,我们可以看到一个HelloWorldController类,它包含了一个名为"/hello"的接口,这个接口可以接受一个名为"name"的参数,并返回一个字符串。 在进行单元测试时,我们可以使用Spring Boot提供的一些工具和注解来模拟请求和验证结果。例如,我们可以使用@RunWith注解来指定测试运行器,使用@SpringBootTest注解来指定使用Spring Boot的上下文环境进行测试,使用@WebAppConfiguration注解来指定使用Web应用程序的配置。 总的来说,使用Spring Boot进行Controller层的单元测试接口测试类似,只是在单元测试中我们可以更加专注于验证Controller的具体逻辑和功能。通过编合适的测试用例,我们可以确保Controller的行为符合我们的预期,并帮助我们发现和解决潜在的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小目标青年

对你有帮助的话,谢谢你的打赏。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值