单元测试

◇◆丶佛笑我妖孽 提交于 2020-03-15 23:39:43

1.需要先在 test 目录下,新建一个类用作测试类。

    用Junit进行单元测试,都需要下面的注解:

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration(locations = {"classpath:applicationContext.xml"})

    applicationContext.xml 是整个项目的Spring的配置文件。包括数据源配置、MVC配置和各种Bean的注册扫描。如果你是多个文件,就用都好隔开写多个:

    { "classpath:applicationContext.xml","classpath:servlet-context.xml"}

 

对Dao层的单元测试

    将 Mapper接口注入进来,直接调用即可。可加上@Transactional 事务注解,从而在单元测试执行出错时,可撤销对数据库的修改。

@Transactional
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:applicationContext.xml"})
public class DaoTests {
   @Autowired
   private UserMapper userMapper;

  @Test
  public void testSelect() {
     User userInfo = userMapper.selectByPrimaryKey(1L);
     System.out.println(userInfo);
  }

  @Test
  public void insert(){
     User user = new User();
     // user.setId(5L);
     user.setAge("9");
     user.setName("王五");
     user.setSex("M");
     user.setCreateTime(new Date());
     userMapper.insert(user);
  }

  @Test
  public void testUpdate() {
     User user = new User();
     user.setId(5L);
     user.setAge("999");
     user.setName("王五");
     user.setSex("M");
     user.setCreateTime(new Date());

     userMapper.updateByPrimaryKey(user);
  }

  @Test
  public void testDelete() {
     userMapper.deleteByPrimaryKey(7L);
  }
}

 

Service层的单元测试

    与Dao层基本一致,把Service注入进来调用

 

Controller层的单元测试

    1.把Controller的Bean注入进来,调里面的方法,只测试了方法,没有完整测试调用springMVC的流程。

    2.使用MockMvc模拟通过url的接口调用。MockMvc是SpringMVC提供的Controller测试类,每次进行单元测试时,都是预先执行@Before中的setup方法,初始healthArticleController单元测试环境。

    注意:一定要把待测试的Controller实例进行MockMvcBuilders.standaloneSetup(xxxxController).build(); 否则会抛出无法找到@RequestMapping路径的异常:No mapping found for HTTP request with URI [/cms/app/getArticleList] in DispatcherServlet

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.ResultActions;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;


@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:applicationContext.xml"})
public class ControllerTest {
    @Autowired
    private UserController userController;

    private MockMvc mockMvc;

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

    @Test
    public void Ctest() throws Exception {
        ResultActions resultActions = this.mockMvc.perform(MockMvcRequestBuilders.post("/show_user3").param("id", "1"));
        MvcResult mvcResult = resultActions.andReturn();
        String result = mvcResult.getResponse().getContentAsString();
        System.out.println("=====客户端获得反馈数据:" + result);
        // 也可以从response里面取状态码,header,cookies...
        System.out.println(mvcResult.getResponse().getStatus());
    }
}

 

    MockMvc使用方式

    1 MockMvcBuilder构造MockMvc的构造器

    2 MockMvcRequestBuilders创建请求request

    3 mockMvc调用perform,执行一个request请求,调用controller的业务处理逻辑,返回ResultActions

    4 可以通过ResultActions, MockMvcResultMatchers对结果进行验证

    示例:

@RunWith(SpringRunner.class)
@SpringBootTest
@TestExecutionListeners({ MockitoTestExecutionListener.class}) // 使用@MockBean, @SpyBean
public abstract class AbstractBaseTest extends AbstractJUnit4SpringContextTests {
    protected static final Logger LOG = LogUtils.get();
}

public class MockMvcDemo extends AbstractBaseTest {
    private MockMvc mvc;
  
    @Before
    public void setUp() {
        mvc = MockMvcBuilders.standaloneSetup(new AccountController()).build();
    }
  
    @Test
    public void test() throws Exception {
        // 构建请求
        MockHttpServletRequestBuilder request = MockMvcRequestBuilders.get("/account/info")
                .contentType("text/html")
                .accept(MediaType.APPLICATION_JSON);
  
        // 发送请求,获取请求结果
        ResultActions perform = mvc.perform(request);
  
        // 请求结果校验
        perform.andExpect(MockMvcResultMatchers.status().isOk());
  
        MvcResult mvcResult = perform.andReturn();
        MockHttpServletResponse response = mvcResult.getResponse();
  
        // 校验类:org.springframework.test.web.servlet.result.MockMvcResultMatchers
    }
}

    1 MockMvcBuilder

        MockMvcBuilder是MockMvc的构造器,主要有两个实现:StandaloneMockMvcBuilder和DefaultMockMvcBuilder。

        ① MockMvcBuilders.webAppContextSetup(WebApplicationContext context):集成Web环境方式,指定WebApplicationContext,将会从该上下文获取相应的控制器并得到相应的MockMvc;

        ② MockMvcBuilders.standaloneSetup(Object... controllers):独立测试方式,通过参数指定一组控制器,这样就不需要从上下文获取了,比如this.mockMvc =MockMvcBuilders.standaloneSetup(new AccountController()).build();

    2 MockMvcRequestBuilders

        MockMvcRequestBuilders用于构建请求,返回MockHttpServletRequestBuilder / MockMultipartHttpServletRequestBuilder ,

        MockMvcRequestBuilders常用API:

        MockHttpServletRequestBuilder get(String urlTemplate, Object... urlVariables):根据uri模板和uri变量值得到一个GET请求方式的MockHttpServletRequestBuilder;如get(/user/{id}, 1L);

        MockHttpServletRequestBuilder post(String urlTemplate, Object... urlVariables):同get类似,但是是POST方法;

        MockHttpServletRequestBuilder put(String urlTemplate, Object... urlVariables):同get类似,但是是PUT方法;

        MockHttpServletRequestBuilder delete(String urlTemplate, Object... urlVariables) :同get类似,但是是DELETE方法;

        MockHttpServletRequestBuilder options(String urlTemplate, Object... urlVariables):同get类似,但是是OPTIONS方法;

        MockHttpServletRequestBuilder request(HttpMethod httpMethod, String urlTemplate, Object... urlVariables): 提供自己的Http请求方法及uri模板和uri变量,如上API都是委托给这个API;

        MockMultipartHttpServletRequestBuilder fileUpload(String urlTemplate, Object... urlVariables):提供文件上传方式的请求,得到MockMultipartHttpServletRequestBuilder;

        RequestBuilder asyncDispatch(final MvcResult mvcResult):创建一个从启动异步处理的请求的MvcResult进行异步分派的RequestBuilder;

        MockHttpServletRequestBuilder常用API:

        MockHttpServletRequestBuilder header(String name, Object... values)/MockHttpServletRequestBuilder headers(HttpHeaders httpHeaders):添加头信息;

        MockHttpServletRequestBuilder contentType(MediaType mediaType):指定请求的contentType头信息;

        MockHttpServletRequestBuilder accept(MediaType... mediaTypes)/MockHttpServletRequestBuilder accept(String... mediaTypes):指定请求的Accept头信息;

        MockHttpServletRequestBuilder content(byte[] content)/MockHttpServletRequestBuilder content(String content):指定请求Body体内容;

        MockHttpServletRequestBuilder cookie(Cookie... cookies):指定请求的Cookie;

        MockHttpServletRequestBuilder locale(Locale locale):指定请求的Locale;

        MockHttpServletRequestBuilder characterEncoding(String encoding):指定请求字符编码;

        MockHttpServletRequestBuilder requestAttr(String name, Object value) :设置请求属性数据;

        MockHttpServletRequestBuilder sessionAttr(String name, Object value)/MockHttpServletRequestBuilder sessionAttrs(Map<string, object=""> sessionAttributes):设置请求session属性数据;

        MockHttpServletRequestBuilder flashAttr(String name, Object value)/MockHttpServletRequestBuilder flashAttrs(Map<string, object=""> flashAttributes):指定请求的flash信息,比如重定向后的属性信息;

        MockHttpServletRequestBuilder session(MockHttpSession session) :指定请求的Session;

        MockHttpServletRequestBuilder principal(Principal principal) :指定请求的Principal;

        MockHttpServletRequestBuilder contextPath(String contextPath) :指定请求的上下文路径,必须以“/”开头,且不能以“/”结尾;

        MockHttpServletRequestBuilder pathInfo(String pathInfo) :请求的路径信息,必须以“/”开头;

        MockHttpServletRequestBuilder secure(boolean secure):请求是否使用安全通道;

        MockHttpServletRequestBuilder with(RequestPostProcessor postProcessor):请求的后处理器,用于自定义一些请求处理的扩展点;

        MockMultipartHttpServletRequestBuilder继承自MockHttpServletRequestBuilder,又提供了如下API:

        MockMultipartHttpServletRequestBuilder file(String name, byte[] content)/MockMultipartHttpServletRequestBuilder file(MockMultipartFile file):指定要上传的文件;

        示例:

MockHttpServletRequestBuilder request = MockMvcRequestBuilders.get("/account/info").contentType("text/html").accept(MediaType.APPLICATION_JSON);

    3 ResultActions

        MockMvc.perform(RequestBuilder requestBuilder)调用后返回ResultActions:

        ResultActions.andExpect:添加执行完成后的断言。添加ResultMatcher验证规则,验证控制器执行完成后结果是否正确;

        ResultActions.andDo:添加一个结果处理器,比如此处使用.andDo(MockMvcResultHandlers.print())输出整个响应结果信息,可以在调试的时候使用;

        ResultActions.andReturn:表示执行完成后返回相应的结果,用于自定义验证/下一步的异步处理;

    4 ResultMatchers

        ResultMatcher验证匹配执行完请求后的结果,只有一个match(MvcResult result)断言方法,如果匹配失败将抛出相应的异常。

        spring mvc测试框架提供了很多 ResultMatchers 来满足测试需求,可以通过MockMvcResultMatchers查看内置ResultMatcher。(注意:ResultMatchers不是ResultMatcher的实现子类)

        HandlerResultMatchers handler():请求的Handler验证器,比如验证处理器类型/方法名;此处的Handler其实就是处理请求的控制器;

        RequestResultMatchers request():得到RequestResultMatchers验证器;

        ModelResultMatchers model():得到模型验证器;

        ViewResultMatchers view():得到视图验证器;

        FlashAttributeResultMatchers flash():得到Flash属性验证;

        StatusResultMatchers status():得到响应状态验证器;

        HeaderResultMatchers header():得到响应Header验证器;

        CookieResultMatchers cookie():得到响应Cookie验证器;

        ContentResultMatchers content():得到响应内容验证器;

        JsonPathResultMatchers jsonPath(String expression, Object ... args)/ResultMatcher jsonPath(String expression, Matcher matcher):得到Json表达式验证器;

        XpathResultMatchers xpath(String expression, Object... args)/XpathResultMatchers xpath(String expression, Map<string, string=""> namespaces, Object... args):得到Xpath表达式验证器;

        ResultMatcher forwardedUrl(final String expectedUrl):验证处理完请求后转发的url(绝对匹配);

        ResultMatcher forwardedUrlPattern(final String urlPattern):验证处理完请求后转发的url(Ant风格模式匹配,@since spring4);

        ResultMatcher redirectedUrl(final String expectedUrl):验证处理完请求后重定向的url(绝对匹配);

        ResultMatcher redirectedUrlPattern(final String expectedUrl):验证处理完请求后重定向的url(Ant风格模式匹配,@since spring4);

    5 MvcResult

        MvcResult为执行完控制器后得到的整个结果,并不仅仅是返回值,其包含了测试时需要的所有信息。

        MockHttpServletRequest getRequest():得到执行的请求;

        MockHttpServletResponse getResponse():得到执行后的响应;

        Object getHandler():得到执行的处理器,一般就是控制器;

        HandlerInterceptor[] getInterceptors():得到对处理器进行拦截的拦截器;

        ModelAndView getModelAndView():得到执行后的ModelAndView;

        Exception getResolvedException():得到HandlerExceptionResolver解析后的异常;

        FlashMap getFlashMap():得到FlashMap;

        Object getAsyncResult()/Object getAsyncResult(long timeout):得到异步执行的结果;

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!