Spring Controller单元测试

SpringMVC controller测试较简单,从功能角度划分,可分为两种。一种是调用请求路径测试,另一种是直接调用Controller方法测试。

调用请求路径测试

通过请求路径调用,请求需要经过拦截器,再到对应的Controller方法处理

被测试代码示例

import com.agoura.agoura.entity.Members;
import com.agoura.agoura.service.MembersService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;

@Controller
@RequestMapping("/api")
public class MembersController {

    @Autowired
    private MembersService membersService;

    @RequestMapping(value = "/user", method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
    @ResponseBody
    public String getUser(HttpServletRequest request, @RequestBody String str,
                         @RequestParam(value = "userId") String userId) {
        Members result = membersService.getMemberById(Integer.valueOf(userId));
        return result.toString();
    }
}

测试代码示例

import com.agoura.agoura.entity.Members;
import com.agoura.agoura.service.MembersService;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;

import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.when;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.model;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

@RunWith(SpringJUnit4ClassRunner.class)     //调用Spring单元测试类
@WebAppConfiguration        //调用Java Web组件,如自动注入ServletContext Bean等
@ContextConfiguration(locations = {"classpath*:spring-*.xml"})      //加载Spring配置文件
public class MembersControllerTest2 {

    @Autowired
    protected WebApplicationContext wac;

    @Mock
    private MembersService service;

    @InjectMocks
    private MembersController controller;       //需要测试的Controller

    private MockMvc mockMvc;        //SpringMVC提供的Controller测试类

    private String url;

    @Before
    public void setUp() throws Exception {
        MockitoAnnotations.initMocks(this);
        mockMvc = MockMvcBuilders.standaloneSetup(wac).build();
    }

    @Test
    public void testGetUser() throws Exception {
        url = "the URL to Controller";

        Members m = new Members(3, "wangwu", 1, 5, "12131232342");
        when(service.getMemberById(Mockito.anyInt())).thenReturn(m);

        MvcResult result = mockMvc
                .perform(MockMvcRequestBuilders.post(url)
                        .accept(MediaType.APPLICATION_JSON)
                        .param("userId", "3"))
                .andDo(print())
                .andExpect(status().isOk())
                .andExpect(model().attributeExists("name"))
                .andReturn();
        assertEquals(m.toString(), result.getModelAndView().getModel().get("user").toString());
    }
}

调用Controller方法测试

无法对拦截器和URL路径配置进行测试。测试方法类似于service层单元测试,可以对依赖的service层进行mock。可以参考spring service层单元测试一文

被测试代码示例

测试代码同调用请求路径测试方式部分一样

测试代码示例

import com.agoura.agoura.entity.Members;
import com.agoura.agoura.service.MembersService;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpSession;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;

import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.when;

@RunWith(SpringJUnit4ClassRunner.class)     //调用Spring单元测试类
@WebAppConfiguration        //调用Java Web组件,如自动注入ServletContext Bean等
@ContextConfiguration(locations = {"classpath*:spring-*.xml"})      //加载Spring配置文件
public class MembersControllerTest {
    @Mock
    private MembersService service;

    @InjectMocks
    private MembersController controller;       //需要测试的Controller
    private MockHttpServletRequest request;

    private MockMvc mockMvc;        //SpringMVC提供的Controller测试类

    @Before
    public void setUp() throws Exception {
        MockitoAnnotations.initMocks(this);
        request = new MockHttpServletRequest();
    }

    @Test
    public void testGetUser() throws Exception {
        request.addParameter("userId", "100100");

//      request.addParameter("id", "101010");       //如果需要从request取数据,可以在request中添加parameter

        Members m = new Members(3, "wangwu", 1, 5, "12131232342");
        when(service.getMemberById(Mockito.anyInt())).thenReturn(m);

        String response = new String();
        String result = controller.getUser(request, response, "3");
        assertEquals(m.toString(), result);
    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏一枝花算不算浪漫

SpringBoot自定义序列化的使用方式--WebMvcConfigurationSupport

1251
来自专栏技术专栏

logback日志写入kafka遇到的那些坑

这两天在学习storm实时流的时候需要将logback日志写入kafka,这期间遇到了很多坑,这里把遇到的坑和解决的问题记录一下,和大家共勉

7453
来自专栏Hongten

apache的开源项目-模板引擎(Velocity)_学习了两天就上手啦_源码下载

首先,如果你对Velocity不是很了解,还是建议你去apache的官方网站上去走走....

1051
来自专栏一个会写诗的程序员的博客

Springboot使用JPA操作数据库第七章 使用JPA操作数据库

本章主要介绍如何在Spring Boot的Web应用中使用Mysq数据库,也充分展示Spring Boot的优势(尽可能少的代码和配置).

1163
来自专栏Java技术栈

Spring Boot 集成 Mybatis 实现双数据源

这里用到了Spring Boot + Mybatis + DynamicDataSource配置动态双数据源,可以动态切换数据源实现数据库的读写分离。

1532
来自专栏Java帮帮-微信公众号-技术文章全总结

Java操作数据库Spring(1)

首先是核心配置文件daoContext.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="h...

3556
来自专栏杨建荣的学习笔记

ORA-17500 ODM err的问题排查(r2笔记78天)

今天在一套环境中做系统检查的时候,发现alert日志中有一段ODM的错误。 日志内容大体如下,可以看到是在半夜4点多报的错误。 Clearing Resourc...

2623
来自专栏张善友的专栏

Mono 3.2 上跑NUnit测试

NUnit是一款堪与JUnit齐名的开源的回归测试框架,供.net开发人员做单元测试之用,可以从www.nunit.org网站上免费获得,最新版本是2.5。Mo...

2007
来自专栏Java与Android技术栈

使用 Kotlin + Spring Boot 进行后端开发Kotlin示例一:结合 Redis 进行数据存储和查询示例二:结合 RxJava 模拟顺序、并发地执行任务总结

Kotlin 是一个基于 JVM 的编程语言,它的简洁、便利早已不言而喻。Kotlin 能够胜任 Java 做的所有事。目前,我们公司 C 端 的 Androi...

1063
来自专栏CodingBlock

小白也能看懂的插件化DroidPlugin原理(三)-- 如何拦截startActivity方法

前言:在前两篇文章中分别介绍了动态代理、反射机制和Hook机制,如果对这些还不太了解的童鞋建议先去参考一下前两篇文章。经过了前面两篇文章的铺垫,终于可以玩点真...

2736

扫码关注云+社区