from:从0开始,构建前后端分离应用

1. 一些基本概念

1.1 为什么要进行单元测试?我自己的理解是

1、能够快速发现问题。避免衍生BUG的出现
    在对一些现有代码进行修改时,或者修改现有BUG的时候。都有可能对已有的代码产生影响,产生新的问题。那么怎么能避免新问题的产生呢?那就是执行回归测试,但如果是人工进行费时费力,测试的还不全面。况且一般在进度的压力下,相信很少有人会因为修改一个问题而去回归测试以前的功能。
2、前后端分离的基础
    前后端分离的前提就是前后端不互相依赖,前后端的开发是并行的。前端不可能等待后端接口开发完成后在进行页面的开发,后端同样也不能等待页面出来后在开发后端功能。那么调试就成了问题,怎么办?单元测试就解决了这一问题,对于后端来讲,可以使用Mock的方式,模拟request请求,达到测试的目的。
3、发布代码的质量保证
    如果项目是使用Maven管理的,那么根据Maven对项目周期的定义,test是进行打包、部署的前提条件,也就是每次进行打包或者部署,都是经过单元测试的。那么就从出口确保了代码的质量,将发现BUG的时机提前,提高工作效率。

1.2 什么是Mock

1、在单元测试过程中,到处都充满着Mock这个东西,它是什么?
  Mock的英文意思就是模仿、伪装,简单一点儿理解,就是对测试过程中,测试用例对外部的依赖(难以构造的,或者未完成)的一个模仿,在后台的单元测试过程中,可以将难以构造的HttpRequest请求进行Mock。
2、在百度过程中发现了JMockit、Mockito等等,这些都是什么?
  JMockit和Mockito都是用于单元测试的Mock框架,在我的项目里选择的是Mockito

1.3对后台的测试粒度

采用junit+mock+spring-test进行的测试,是对SpringMvc的一个完整的测试,测试过程会包含DispatcherServlet、数据绑定、拦截器等环节,甚至连视图渲染都可以进行测试。是对后台请求的一个完整测试。并且不需要启动tomcat服务器

2. 添加依赖

 <dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${version.junit}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${version.spring}</version>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>${version.mockito}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-all</artifactId>
<version>${version.hamcrest}</version>
<scope>test</scope>
</dependency>

版本信息

<version.mockito>1.10.19</version.mockito>
<version.hamcrest>1.3</version.hamcrest>
<version.junit>4.12</version.junit>
<version.spring>5.0.2.RELEASE</version.spring>
以上需要注意的是hamcrest是需要引入的,否则有可能会报错,junit需要依赖它。它的作用,我们在编写的时候往往是编写断言来判断测试结果,hamcrest是对junit断言的增强,提供更强大的匹配规则,具体参见Hamcrest官网:http://hamcrest.org/JavaHamcrest/

3. 一些注意事项

1、在编写测试用例的时候,往往要编写基类。@RunWith这个注解是不能写在基类中的,否则基类也会被当成测试用例而执行。而基类中是没有任何测试方法的,这时候junit会报错
    有一个变通的方法,@RunWith注解仍然写在基类上,但是为基类增加@Ignore注解,这样在执行Test的时候,就不执行基类了
2、测试代码放在哪个路径下,这里一定注意,卡了我很久。我最开始的时候写在了/project/test/路径下,结果就是无论怎么执行test命令,测试用例都不行,提示“no tests to run”
    正确的方式应该是将测试代码放在/project/src/test/java/路径下

aaarticlea/png;base64,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" alt="" width="397" />
3、在基类中应该做什么事情?
    定义基类的目的,就是将公共的代码抽象到更高的层次。这里包括注解和代码
4、测试过程的环节
    准备测试环境,包括Spring上下文的配置、测试数据、mockMvc初始化、请求头信息的设置、返回预期的设置等
    通过MockMvc执行请求
    使用断言对结果 进行验证

4. 具体实现

BaseTest.java:
1、定义通用注解,由于代码中的注解都是可以继承的,因此完全可以抽象到基类中,避免其他的测试用例重复的声明这些注解
    注意,@Ignore是必须要添加的,否则Maven的surefire插件也会将基类当成一个测试用例来运行,而基类中是没有任何测试方法的,结果就是报错
2、buildResultActions方法中,定义所有请求的通用设置,header信息,及请求结果的期望值,还有对测试过程的打印。其中就使用了hamcrest判断结果中是否包含SUCCESS信息,如果不包含就证明出错了。另外还定义了Session信息,否则后台会因为session中没有用户信息,而将请求拦截住。

 package com.wt.test.common;

 import com.google.gson.Gson;
import com.wt.common.security.handler.HttpSessionHandler;
import com.wt.common.security.model.SysUser;
import org.hamcrest.Matchers;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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.ResultActions;
import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
import org.springframework.test.web.servlet.result.MockMvcResultHandlers;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.context.WebApplicationContext; /**
* @ProjectName: syInfo
* @Package: com.wt.com.wt.test
* @Description:
* @Author: lichking2017@aliyun.com
* @CreateDate: 2018/5/19 下午5:04
* @Version: v1.0
*/ @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:spring.xml", "classpath:spring-mybatis.xml", "classpath:spring-redis.xml"})
@WebAppConfiguration
@Transactional
@Ignore
public class BaseTest {
Logger logger = LoggerFactory.getLogger(BaseTest.class); @Autowired
WebApplicationContext webApplicationContext; protected MockMvc mockMvc; protected SysUser loginUser; protected Gson gson = new Gson(); @Before
public void setUp() throws Exception {
mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
loginUser = this.createLoginUser();
} /**
* 通用设置
* @param mhsrb
* @return
*/
protected ResultActions buildResultActions(MockHttpServletRequestBuilder mhsrb) {
mhsrb.contentType(MediaType.APPLICATION_JSON_UTF8_VALUE)
.accept(MediaType.APPLICATION_JSON_UTF8_VALUE)
.header("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36")
.header("X-Requested-With", "XMLHttpRequest")
.sessionAttr(HttpSessionHandler.Items.LOGINUSER.name(), loginUser);
try {
return mockMvc
.perform(mhsrb)
.andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.content().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE))
.andExpect(MockMvcResultMatchers.content().string(Matchers.containsString("SUCCESS")))
.andDo(MockMvcResultHandlers.print());
} catch (Exception e) {
logger.error("请求通用设置出错",e);
}
return null;
} private SysUser createLoginUser() {
SysUser sysUser = new SysUser();
sysUser.setUserId("0279c9d48c774b5b825dfb6d1058a816");
sysUser.setAccount("admin");
sysUser.setUserName("系统超级管理员");
return sysUser;
} @After
public void tearDown() throws Exception { } }

测试用例:SysUserControllerTest
1、对于新增用的测试,主要是比对新增前后的表的记录数
2、对更新用户的测试,主要是比对更新后的用户名与要更新的名称是否一致
3、删除用户,也是比对删除前后的记录实现的

 package com.wt.common.security.controller;

 import com.wt.common.security.model.SysUser;
import com.wt.common.security.service.SysUserService;
import com.wt.test.common.BaseTest;
import org.hamcrest.Matchers;
import org.junit.Assert;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List; import static org.hamcrest.MatcherAssert.assertThat; /**
* @ProjectName: syInfo
* @Package: com.wt.common.security.controller
* @Description:
* @Author: lichking2017@aliyun.com
* @CreateDate: 2018/5/19 下午5:01
* @Version: v1.0
*/
public class SysUserControllerTest extends BaseTest { SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss"); @Autowired
private SysUserService sysUserService; private SysUser sysUser; @Override
public void setUp() throws Exception {
super.setUp();
sysUser = this.createSysUser();
} @Test
public void findSysUserByUserId() throws Exception {
} @Test
@Rollback
public void create() throws Exception {
List<SysUser> sysUsers = sysUserService.selectAll();
int beforCount = sysUsers.size() + 1;
super.buildResultActions(MockMvcRequestBuilders
.post("/sysUser/create")
.content(gson.toJson(sysUser)));
List<SysUser> sysUserList = sysUserService.selectAll();
int afterCount = sysUserList.size();
Assert.assertTrue(beforCount == afterCount);
} @Test
public void removeUser() throws Exception {
List<SysUser> beforeUsers = sysUserService.selectAll();
int beforCount = beforeUsers.size();
String userId = "";
for (SysUser sysUser : beforeUsers) {
if ("admin".equals(sysUser.getAccount())) {
continue;
}
userId = sysUser.getUserId();
break;
} super.buildResultActions(MockMvcRequestBuilders
.delete("/sysUser/{userId}", userId)).andReturn(); List<SysUser> afterUsers = sysUserService.selectAll();
int afterCount = afterUsers.size()+1;
assertThat(beforCount, Matchers.equalTo(afterCount));
} @Test
public void update() throws Exception {
try {
List<SysUser> beforeUsers = sysUserService.selectAll();
SysUser forUpdate = new SysUser();
String targetName = simpleDateFormat.format(new Date()); for (SysUser sysUser : beforeUsers) {
if ("admin".equals(sysUser.getAccount())) {
continue;
}
forUpdate = sysUser;
break;
}
String userId = forUpdate.getUserId();
forUpdate.setUserName(targetName);
super.buildResultActions(MockMvcRequestBuilders.put("/sysUser").content(gson.toJson(forUpdate)));
SysUser updatedUser = sysUserService.findById(userId,SysUser.class);
Assert.assertTrue(targetName.equals(updatedUser.getUserName()));
} catch (Exception e) {
e.printStackTrace();
}
} private SysUser createSysUser() {
SysUser sysUser = new SysUser();
sysUser.setUserName("测试数据" + simpleDateFormat.format(new Date()));
sysUser.setPassword("ceshi");
sysUser.setAccount(simpleDateFormat.format(new Date()));
sysUser.setInUse(true);
sysUser.setMail("test@aliyun.com");
return sysUser;
}
}

5. 具体结果

-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running com.wt.test.common.BaseTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 1, Time elapsed: 0.007 sec
Running com.wt.common.security.controller.SysUserControllerTest
2018-05-21 21:02:46,563 INFO WebTestContextBootstrapper:257 - Loaded default TestExecutionListener class names from location [META-INF/spring.factories]: [org.springframework.test.context.web.ServletTestExecutionListener, org.springframework.test.context.support.DirtiesContextBeforeModesTestExecutionListener, org.springframework.test.context.support.DependencyInjectionTestExecutionListener, org.springframework.test.context.support.DirtiesContextTestExecutionListener, org.springframework.test.context.transaction.TransactionalTestExecutionListener, org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener]
2018-05-21 21:02:46,583 INFO WebTestContextBootstrapper:184 - Using TestExecutionListeners: [org.springframework.test.context.web.ServletTestExecutionListener@217ed35e, org.springframework.test.context.support.DirtiesContextBeforeModesTestExecutionListener@7dcf94f8, org.springframework.test.context.support.DependencyInjectionTestExecutionListener@229f66ed, org.springframework.test.context.support.DirtiesContextTestExecutionListener@31190526, org.springframework.test.context.transaction.TransactionalTestExecutionListener@662ac478, org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener@6743e411]
2018-05-21 21:02:46,714 INFO XmlBeanDefinitionReader:316 - Loading XML bean definitions from class path resource [spring.xml]
2018-05-21 21:02:47,012 INFO XmlBeanDefinitionReader:316 - Loading XML bean definitions from class path resource [spring-mybatis.xml]
2018-05-21 21:02:47,058 INFO XmlBeanDefinitionReader:316 - Loading XML bean definitions from class path resource [spring-redis.xml]
2018-05-21 21:02:47,074 INFO GenericWebApplicationContext:589 - Refreshing org.springframework.web.context.support.GenericWebApplicationContext@59af0466: startup date [Mon May 21 21:02:47 CST 2018]; root of context hierarchy
2018-05-21 21:02:47,325 INFO AutowiredAnnotationBeanPostProcessor:154 - JSR-330 'javax.inject.Inject' annotation found and supported for autowiring
2018-05-21 21:02:48,565 INFO RequestMappingHandlerMapping:549 - Mapped "{[/syslogPerformance/getData],methods=[GET]}" onto public com.wt.common.core.result.HttpResultEntity<?> com.wt.common.security.controller.SyslogPerformanceController.getData()
2018-05-21 21:02:48,571 INFO RequestMappingHandlerMapping:549 - Mapped "{[/sysUser],methods=[PUT]}" onto public com.wt.common.core.result.HttpResultEntity<?> com.wt.common.security.controller.SysUserController.update(com.wt.common.security.model.SysUser)
2018-05-21 21:02:48,571 INFO RequestMappingHandlerMapping:549 - Mapped "{[/sysUser/create],methods=[POST]}" onto public com.wt.common.core.result.HttpResultEntity<?> com.wt.common.security.controller.SysUserController.create(com.wt.common.security.model.SysUser)
2018-05-21 21:02:48,572 INFO RequestMappingHandlerMapping:549 - Mapped "{[/sysUser/login],methods=[GET]}" onto public com.wt.common.core.result.HttpResultEntity<?> com.wt.common.security.controller.SysUserController.login(java.lang.String,java.lang.String) throws com.wt.common.security.exception.BaseSecurityException
2018-05-21 21:02:48,573 INFO RequestMappingHandlerMapping:549 - Mapped "{[/sysUser/userByUserId/{userId}],methods=[GET]}" onto public com.wt.common.core.result.HttpResultEntity<?> com.wt.common.security.controller.SysUserController.findSysUserByUserId(java.lang.String)
2018-05-21 21:02:48,573 INFO RequestMappingHandlerMapping:549 - Mapped "{[/sysUser/{userId}],methods=[DELETE]}" onto public com.wt.common.core.result.HttpResultEntity<?> com.wt.common.security.controller.SysUserController.removeUser(java.lang.String)
2018-05-21 21:02:48,574 INFO RequestMappingHandlerMapping:549 - Mapped "{[/sysUser/userAll],methods=[GET]}" onto public com.wt.common.core.result.HttpResultEntity<?> com.wt.common.security.controller.SysUserController.queryAllUser()
2018-05-21 21:02:48,575 INFO RequestMappingHandlerMapping:549 - Mapped "{[/sysUser/deleteBatch],methods=[DELETE]}" onto public com.wt.common.core.result.HttpResultEntity<?> com.wt.common.security.controller.SysUserController.removeUsers(java.util.List<java.lang.String>)
2018-05-21 21:02:48,576 INFO RequestMappingHandlerMapping:549 - Mapped "{[/sysUser/{id}],methods=[GET]}" onto public com.wt.common.core.result.HttpResultEntity<?> com.wt.common.security.controller.SysUserController.querySysMenu(java.lang.String)
2018-05-21 21:02:48,576 INFO RequestMappingHandlerMapping:549 - Mapped "{[/sysUser/getData],methods=[GET]}" onto public com.wt.common.core.result.HttpResultEntity<?> com.wt.common.security.controller.SysUserController.getData()
2018-05-21 21:02:48,584 INFO RequestMappingHandlerMapping:549 - Mapped "{[/sysMenu],methods=[PUT]}" onto public com.wt.common.core.result.HttpResultEntity<?> com.wt.common.security.controller.SysMenuController.update(com.wt.common.security.model.SysMenu)
2018-05-21 21:02:48,585 INFO RequestMappingHandlerMapping:549 - Mapped "{[/sysMenu/{id}],methods=[DELETE]}" onto public com.wt.common.core.result.HttpResultEntity<?> com.wt.common.security.controller.SysMenuController.delete(java.lang.String)
2018-05-21 21:02:48,586 INFO RequestMappingHandlerMapping:549 - Mapped "{[/sysMenu/create],methods=[POST]}" onto public com.wt.common.core.result.HttpResultEntity<?> com.wt.common.security.controller.SysMenuController.create(com.wt.common.security.model.SysMenu)
2018-05-21 21:02:48,586 INFO RequestMappingHandlerMapping:549 - Mapped "{[/sysMenu/{id}],methods=[GET]}" onto public com.wt.common.core.result.HttpResultEntity<?> com.wt.common.security.controller.SysMenuController.querySysMenu(java.lang.String)
2018-05-21 21:02:48,587 INFO RequestMappingHandlerMapping:549 - Mapped "{[/sysMenu/deleteBatch],methods=[DELETE]}" onto public com.wt.common.core.result.HttpResultEntity<?> com.wt.common.security.controller.SysMenuController.deleteBatch(java.util.List<java.lang.String>)
2018-05-21 21:02:48,588 INFO RequestMappingHandlerMapping:549 - Mapped "{[/sysMenu/queryAdminMenu],methods=[GET]}" onto public com.wt.common.core.result.HttpResultEntity<?> com.wt.common.security.controller.SysMenuController.queryAdminMenu()
2018-05-21 21:02:48,589 INFO RequestMappingHandlerMapping:549 - Mapped "{[/sysMenu/queryAll],methods=[GET]}" onto public com.wt.common.core.result.HttpResultEntity<?> com.wt.common.security.controller.SysMenuController.queryAll()
2018-05-21 21:02:48,590 INFO RequestMappingHandlerMapping:549 - Mapped "{[/sysMenu/getData],methods=[GET]}" onto public com.wt.common.core.result.HttpResultEntity<?> com.wt.common.security.controller.SysMenuController.getData()
2018-05-21 21:02:48,592 INFO RequestMappingHandlerMapping:549 - Mapped "{[/upload/uploadImage],methods=[POST]}" onto public com.wt.common.core.result.HttpResultEntity<?> com.wt.common.upload.controller.UploadFileController.uploadImage(org.springframework.web.multipart.MultipartFile[]) throws com.wt.common.upload.exception.UploadException
2018-05-21 21:02:48,592 INFO RequestMappingHandlerMapping:549 - Mapped "{[/upload/deleteFile/{fileId}],methods=[DELETE]}" onto public com.wt.common.core.result.HttpResultEntity<?> com.wt.common.upload.controller.UploadFileController.deleteFile(java.lang.String)
2018-05-21 21:02:48,762 INFO RequestMappingHandlerAdapter:568 - Looking for @ControllerAdvice: org.springframework.web.context.support.GenericWebApplicationContext@59af0466: startup date [Mon May 21 21:02:47 CST 2018]; root of context hierarchy
2018-05-21 21:02:48,850 INFO RequestMappingHandlerAdapter:568 - Looking for @ControllerAdvice: org.springframework.web.context.support.GenericWebApplicationContext@59af0466: startup date [Mon May 21 21:02:47 CST 2018]; root of context hierarchy
2018-05-21 21:02:49,252 INFO DruidDataSource:928 - {dataSource-1} inited
2018-05-21 21:02:49,566 INFO TransactionContext:105 - Began transaction (1) for test context [DefaultTestContext@3ed03652 testClass = SysUserControllerTest, testInstance = com.wt.common.security.controller.SysUserControllerTest@4aedaf61, testMethod = findSysUserByUserId@SysUserControllerTest, testException = [null], mergedContextConfiguration = [WebMergedContextConfiguration@173797f0 testClass = SysUserControllerTest, locations = '{classpath:spring.xml, classpath:spring-mybatis.xml, classpath:spring-redis.xml}', classes = '{}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{}', contextCustomizers = set[org.springframework.test.context.web.socket.MockServerContainerContextCustomizer@4efbca5a], resourceBasePath = 'src/main/webapp', contextLoader = 'org.springframework.test.context.web.WebDelegatingSmartContextLoader', parent = [null]], attributes = map['org.springframework.test.context.web.ServletTestExecutionListener.populatedRequestContextHolder' -> true, 'org.springframework.test.context.web.ServletTestExecutionListener.resetRequestContextHolder' -> true]]; transaction manager [org.springframework.jdbc.datasource.DataSourceTransactionManager@3c35c345]; rollback [true]
2018-05-21 21:02:49,579 INFO MockServletContext:438 - Initializing Spring FrameworkServlet ''
2018-05-21 21:02:49,579 INFO TestDispatcherServlet:494 - FrameworkServlet '': initialization started
2018-05-21 21:02:49,624 INFO TestDispatcherServlet:513 - FrameworkServlet '': initialization completed in 45 ms
2018-05-21 21:02:49,629 INFO TransactionContext:137 - Rolled back transaction for test context [DefaultTestContext@3ed03652 testClass = SysUserControllerTest, testInstance = com.wt.common.security.controller.SysUserControllerTest@4aedaf61, testMethod = findSysUserByUserId@SysUserControllerTest, testException = [null], mergedContextConfiguration = [WebMergedContextConfiguration@173797f0 testClass = SysUserControllerTest, locations = '{classpath:spring.xml, classpath:spring-mybatis.xml, classpath:spring-redis.xml}', classes = '{}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{}', contextCustomizers = set[org.springframework.test.context.web.socket.MockServerContainerContextCustomizer@4efbca5a], resourceBasePath = 'src/main/webapp', contextLoader = 'org.springframework.test.context.web.WebDelegatingSmartContextLoader', parent = [null]], attributes = map['org.springframework.test.context.web.ServletTestExecutionListener.populatedRequestContextHolder' -> true, 'org.springframework.test.context.web.ServletTestExecutionListener.resetRequestContextHolder' -> true]].
2018-05-21 21:02:49,632 INFO TransactionContext:105 - Began transaction (1) for test context [DefaultTestContext@3ed03652 testClass = SysUserControllerTest, testInstance = com.wt.common.security.controller.SysUserControllerTest@58496c97, testMethod = create@SysUserControllerTest, testException = [null], mergedContextConfiguration = [WebMergedContextConfiguration@173797f0 testClass = SysUserControllerTest, locations = '{classpath:spring.xml, classpath:spring-mybatis.xml, classpath:spring-redis.xml}', classes = '{}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{}', contextCustomizers = set[org.springframework.test.context.web.socket.MockServerContainerContextCustomizer@4efbca5a], resourceBasePath = 'src/main/webapp', contextLoader = 'org.springframework.test.context.web.WebDelegatingSmartContextLoader', parent = [null]], attributes = map['org.springframework.test.context.web.ServletTestExecutionListener.populatedRequestContextHolder' -> true, 'org.springframework.test.context.web.ServletTestExecutionListener.resetRequestContextHolder' -> true]]; transaction manager [org.springframework.jdbc.datasource.DataSourceTransactionManager@3c35c345]; rollback [true]
2018-05-21 21:02:49,633 INFO MockServletContext:438 - Initializing Spring FrameworkServlet ''
2018-05-21 21:02:49,633 INFO TestDispatcherServlet:494 - FrameworkServlet '': initialization started
2018-05-21 21:02:49,635 INFO TestDispatcherServlet:513 - FrameworkServlet '': initialization completed in 1 ms
2018-05-21 21:02:49,820 INFO LoginInterceptor:63 - ⭐️{User-Agent:[Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36],Protocol:[HTTP/1.1],Remote Addr:[127.0.0.1],Method:[POST],uri:[/sysUser/create],Cookie:[null],operator:[ceshi],parameters:[[{"password":"ceshi","account":"20180521210249","userName":"测试数据20180521210249","inUse":true,"mail":"test@aliyun.com"}]]}⭐️ MockHttpServletRequest:
HTTP Method = POST
Request URI = /sysUser/create
Parameters = {}
Headers = {Content-Type=[application/json;charset=UTF-8], Accept=[application/json;charset=UTF-8], User-Agent=[Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36], X-Requested-With=[XMLHttpRequest]}
Body = {"password":"ceshi","account":"20180521210249","userName":"测试数据20180521210249","inUse":true,"mail":"test@aliyun.com"}
Session Attrs = {LOGINUSER=com.wt.common.security.model.SysUser@5292ceca} Handler:
Type = com.wt.common.security.controller.SysUserController
Method = public com.wt.common.core.result.HttpResultEntity<?> com.wt.common.security.controller.SysUserController.create(com.wt.common.security.model.SysUser) Async:
Async started = false
Async result = null Resolved Exception:
Type = null ModelAndView:
View name = null
View = null
Model = null FlashMap:
Attributes = null MockHttpServletResponse:
Status = 200
Error message = null
Headers = {Content-Type=[application/json;charset=UTF-8]}
Content type = application/json;charset=UTF-8
Body = {"errorCode":"0","message":"SUCCESS","result":null}
Forwarded URL = null
Redirected URL = null
Cookies = []
2018-05-21 21:02:49,907 INFO TransactionContext:137 - Rolled back transaction for test context [DefaultTestContext@3ed03652 testClass = SysUserControllerTest, testInstance = com.wt.common.security.controller.SysUserControllerTest@58496c97, testMethod = create@SysUserControllerTest, testException = [null], mergedContextConfiguration = [WebMergedContextConfiguration@173797f0 testClass = SysUserControllerTest, locations = '{classpath:spring.xml, classpath:spring-mybatis.xml, classpath:spring-redis.xml}', classes = '{}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{}', contextCustomizers = set[org.springframework.test.context.web.socket.MockServerContainerContextCustomizer@4efbca5a], resourceBasePath = 'src/main/webapp', contextLoader = 'org.springframework.test.context.web.WebDelegatingSmartContextLoader', parent = [null]], attributes = map['org.springframework.test.context.web.ServletTestExecutionListener.populatedRequestContextHolder' -> true, 'org.springframework.test.context.web.ServletTestExecutionListener.resetRequestContextHolder' -> true]].
2018-05-21 21:02:49,910 INFO TransactionContext:105 - Began transaction (1) for test context [DefaultTestContext@3ed03652 testClass = SysUserControllerTest, testInstance = com.wt.common.security.controller.SysUserControllerTest@62e93c3a, testMethod = update@SysUserControllerTest, testException = [null], mergedContextConfiguration = [WebMergedContextConfiguration@173797f0 testClass = SysUserControllerTest, locations = '{classpath:spring.xml, classpath:spring-mybatis.xml, classpath:spring-redis.xml}', classes = '{}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{}', contextCustomizers = set[org.springframework.test.context.web.socket.MockServerContainerContextCustomizer@4efbca5a], resourceBasePath = 'src/main/webapp', contextLoader = 'org.springframework.test.context.web.WebDelegatingSmartContextLoader', parent = [null]], attributes = map['org.springframework.test.context.web.ServletTestExecutionListener.populatedRequestContextHolder' -> true, 'org.springframework.test.context.web.ServletTestExecutionListener.resetRequestContextHolder' -> true]]; transaction manager [org.springframework.jdbc.datasource.DataSourceTransactionManager@3c35c345]; rollback [true]
2018-05-21 21:02:49,911 INFO MockServletContext:438 - Initializing Spring FrameworkServlet ''
2018-05-21 21:02:49,911 INFO TestDispatcherServlet:494 - FrameworkServlet '': initialization started
2018-05-21 21:02:49,913 INFO TestDispatcherServlet:513 - FrameworkServlet '': initialization completed in 1 ms
2018-05-21 21:02:49,938 INFO LoginInterceptor:63 - ⭐️{User-Agent:[Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36],Protocol:[HTTP/1.1],Remote Addr:[127.0.0.1],Method:[PUT],uri:[/sysUser],Cookie:[null],operator:[ceshi],parameters:[[{"userId":"6057e4e4da6542f2bc32de5a43096dcd","password":"zBfDDNERxyFfyPUfh5Dg4Q\u003d\u003d","account":"20180521142248","userName":"20180521210249","inUse":true,"mail":"test@aliyun.com","creator":"099","changedBy":"099","lastUpdate":"2018-05-20","deleteFlag":false}]]}⭐️ MockHttpServletRequest:
HTTP Method = PUT
Request URI = /sysUser
Parameters = {}
Headers = {Content-Type=[application/json;charset=UTF-8], Accept=[application/json;charset=UTF-8], User-Agent=[Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36], X-Requested-With=[XMLHttpRequest]}
Body = {"userId":"6057e4e4da6542f2bc32de5a43096dcd","password":"zBfDDNERxyFfyPUfh5Dg4Q\u003d\u003d","account":"20180521142248","userName":"20180521210249","inUse":true,"mail":"test@aliyun.com","creator":"099","changedBy":"099","lastUpdate":"2018-05-20","deleteFlag":false}
Session Attrs = {LOGINUSER=com.wt.common.security.model.SysUser@292158f8} Handler:
Type = com.wt.common.security.controller.SysUserController
Method = public com.wt.common.core.result.HttpResultEntity<?> com.wt.common.security.controller.SysUserController.update(com.wt.common.security.model.SysUser) Async:
Async started = false
Async result = null Resolved Exception:
Type = null ModelAndView:
View name = null
View = null
Model = null FlashMap:
Attributes = null MockHttpServletResponse:
Status = 200
Error message = null
Headers = {Content-Type=[application/json;charset=UTF-8]}
Content type = application/json;charset=UTF-8
Body = {"errorCode":"0","message":"SUCCESS","result":null}
Forwarded URL = null
Redirected URL = null
Cookies = []
2018-05-21 21:02:49,958 INFO TransactionContext:137 - Rolled back transaction for test context [DefaultTestContext@3ed03652 testClass = SysUserControllerTest, testInstance = com.wt.common.security.controller.SysUserControllerTest@62e93c3a, testMethod = update@SysUserControllerTest, testException = [null], mergedContextConfiguration = [WebMergedContextConfiguration@173797f0 testClass = SysUserControllerTest, locations = '{classpath:spring.xml, classpath:spring-mybatis.xml, classpath:spring-redis.xml}', classes = '{}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{}', contextCustomizers = set[org.springframework.test.context.web.socket.MockServerContainerContextCustomizer@4efbca5a], resourceBasePath = 'src/main/webapp', contextLoader = 'org.springframework.test.context.web.WebDelegatingSmartContextLoader', parent = [null]], attributes = map['org.springframework.test.context.web.ServletTestExecutionListener.populatedRequestContextHolder' -> true, 'org.springframework.test.context.web.ServletTestExecutionListener.resetRequestContextHolder' -> true]].
2018-05-21 21:02:49,962 INFO TransactionContext:105 - Began transaction (1) for test context [DefaultTestContext@3ed03652 testClass = SysUserControllerTest, testInstance = com.wt.common.security.controller.SysUserControllerTest@6944e53e, testMethod = removeUser@SysUserControllerTest, testException = [null], mergedContextConfiguration = [WebMergedContextConfiguration@173797f0 testClass = SysUserControllerTest, locations = '{classpath:spring.xml, classpath:spring-mybatis.xml, classpath:spring-redis.xml}', classes = '{}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{}', contextCustomizers = set[org.springframework.test.context.web.socket.MockServerContainerContextCustomizer@4efbca5a], resourceBasePath = 'src/main/webapp', contextLoader = 'org.springframework.test.context.web.WebDelegatingSmartContextLoader', parent = [null]], attributes = map['org.springframework.test.context.web.ServletTestExecutionListener.populatedRequestContextHolder' -> true, 'org.springframework.test.context.web.ServletTestExecutionListener.resetRequestContextHolder' -> true]]; transaction manager [org.springframework.jdbc.datasource.DataSourceTransactionManager@3c35c345]; rollback [true]
2018-05-21 21:02:49,962 INFO MockServletContext:438 - Initializing Spring FrameworkServlet ''
2018-05-21 21:02:49,963 INFO TestDispatcherServlet:494 - FrameworkServlet '': initialization started
2018-05-21 21:02:49,965 INFO TestDispatcherServlet:513 - FrameworkServlet '': initialization completed in 2 ms
2018-05-21 21:02:49,978 INFO LoginInterceptor:63 - ⭐️{User-Agent:[Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36],Protocol:[HTTP/1.1],Remote Addr:[127.0.0.1],Method:[DELETE],uri:[/sysUser/6057e4e4da6542f2bc32de5a43096dcd],Cookie:[null],operator:[ceshi],parameters:[["6057e4e4da6542f2bc32de5a43096dcd"]]}⭐️ MockHttpServletRequest:
HTTP Method = DELETE
Request URI = /sysUser/6057e4e4da6542f2bc32de5a43096dcd
Parameters = {}
Headers = {Content-Type=[application/json;charset=UTF-8], Accept=[application/json;charset=UTF-8], User-Agent=[Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36], X-Requested-With=[XMLHttpRequest]}
Body = null
Session Attrs = {LOGINUSER=com.wt.common.security.model.SysUser@1e469dfd} Handler:
Type = com.wt.common.security.controller.SysUserController
Method = public com.wt.common.core.result.HttpResultEntity<?> com.wt.common.security.controller.SysUserController.removeUser(java.lang.String) Async:
Async started = false
Async result = null Resolved Exception:
Type = null ModelAndView:
View name = null
View = null
Model = null FlashMap:
Attributes = null MockHttpServletResponse:
Status = 200
Error message = null
Headers = {Content-Type=[application/json;charset=UTF-8]}
Content type = application/json;charset=UTF-8
Body = {"errorCode":"0","message":"SUCCESS","result":null}
Forwarded URL = null
Redirected URL = null
Cookies = []
2018-05-21 21:02:49,994 INFO TransactionContext:137 - Rolled back transaction for test context [DefaultTestContext@3ed03652 testClass = SysUserControllerTest, testInstance = com.wt.common.security.controller.SysUserControllerTest@6944e53e, testMethod = removeUser@SysUserControllerTest, testException = [null], mergedContextConfiguration = [WebMergedContextConfiguration@173797f0 testClass = SysUserControllerTest, locations = '{classpath:spring.xml, classpath:spring-mybatis.xml, classpath:spring-redis.xml}', classes = '{}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{}', contextCustomizers = set[org.springframework.test.context.web.socket.MockServerContainerContextCustomizer@4efbca5a], resourceBasePath = 'src/main/webapp', contextLoader = 'org.springframework.test.context.web.WebDelegatingSmartContextLoader', parent = [null]], attributes = map['org.springframework.test.context.web.ServletTestExecutionListener.populatedRequestContextHolder' -> true, 'org.springframework.test.context.web.ServletTestExecutionListener.resetRequestContextHolder' -> true]].
Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 4.295 sec
2018-05-21 21:02:49,998 INFO GenericWebApplicationContext:989 - Closing org.springframework.web.context.support.GenericWebApplicationContext@59af0466: startup date [Mon May 21 21:02:47 CST 2018]; root of context hierarchy
2018-05-21 21:02:50,007 INFO DruidDataSource:1823 - {dataSource-1} closed Results : Tests run: 5, Failures: 0, Errors: 0, Skipped: 1 [INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 6.527 s
[INFO] Finished at: 2018-05-21T21:02:50+08:00
[INFO] Final Memory: 16M/307M
[INFO] ------------------------------------------------------------------------ Process finished with exit code 0

junit+mock+spring-test构建后台单元测试的更多相关文章

  1. Java单元测试(Junit+Mock+代码覆盖率)---------转

    Java单元测试(Junit+Mock+代码覆盖率) 原文见此处 单元测试是编写测试代码,用来检测特定的.明确的.细颗粒的功能.单元测试并不一定保证程序功能是正确的,更不保证整体业务是准备的. 单元测 ...

  2. Junit+Mock单元测试

    项目用的是maven,所需jar包在pom.xml文件里面配置,单元测试要用的jar具体如下: <dependency> <groupId>junit</groupId& ...

  3. Spring+Junit+Mock测试web项目,即Controller

    准备:Maven依赖 <!-- Spring和MVC的包这里不列出来了,webmvc,aspects,orm,其他maven会自动导 --> <dependency> < ...

  4. [spring源码学习]单元测试演化

    1.使用main方法 最早的测试方法一般是在类中增加main方法,然后在main方法中增加对每个方法的测试代码,如果要测其中一个,就屏蔽掉其他的测试代码,执行后,根据log的打印来判断测试是否成功 2 ...

  5. Mock&Spring集成

    Mock&Spring集成 常规Mock单元测试 请参考上一篇文档Mock mock框架的功能性对比 http://jmockit.github.io/MockingToolkitCompar ...

  6. 真正意义上的spring环境中的单元测试方案spring-test与mokito完美结合

    真正意义上的spring环境中的单元测试方案spring-test与mokito完美结合 博客分类: java 测试 单元测试SpringCC++C#  一.要解决的问题:     spring环境中 ...

  7. Spring Boot中使用 Spring Security 构建权限系统

    Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以在Spring应用上下文中配置的Bean,为应用系统提供声明式的安全 ...

  8. 【Spring】构建Spring Web应用

    前言 学习了Spring的注解.AOP后,接着学习Spring Web,对于Web应用开发,Spring提供了Web框架. Web应用 Spring MVC初探 MVC为(Model-View-Con ...

  9. 【转】Spring Boot 构建应用——快速构建 Spring Boot 应用

    Spring Boot 简化了 Spring 应用开发,不需要配置就能运行 Spring 应用,Spring Boot 的自动配置是通过 Spring 4.x 的条件注解 @Conditional 来 ...

随机推荐

  1. winform编程设定listview选中行

    在做项目中,需要用到listview显示数据.同时,项目要求,通过检索用户输入的数据,程序通过搜索,确定数据所在的行并通过程序设定为选中状态并高亮显示.同时,正常响应鼠标单击响应的效果,单击时,程序设 ...

  2. myBatis源码之Configuration

    Configuration类主要是用来存储对mybatis的配置文件及mapper文件解析后的数据,Configuration对象会贯穿整个myabtis的执行流程,为mybatis的执行过程提供必要 ...

  3. 面试之路(8)-BAT面试题之数组和链表的区别

    两种数据结构都是线性表,在排序和查找等算法中都有广泛的应用 各自的特点: 数组: 数组是将元素在内存中连续存放,由于每个元素占用内存相同,可以通过下标迅速访问数组中任何元素.但是如果要在数组中增加一个 ...

  4. The 14th tip of DB Query Analyzer

      The 14th tip of DB Query Analyzer Ma Genfeng (Guangdong Unitoll Services incorporated, Guangzhou 5 ...

  5. solr研磨之facet

    作者:战斗民族就是干 转载请注明地址:http://www.cnblogs.com/prayers/p/8822417.html Facet 开门见山,facet解决的就是筛选,我是把它理解为一种聚合 ...

  6. 记一次erlang语言bug导致rabbitmq的队列没有消费者的问题

    公司开发和测试环境采用的erlang版本是19.0.3,rabbitmq版本为3.6.10.集群条件下稳定使用了近一年时间,没什么问题. 为了保持和线下一致,线上生产环境采用了相同的版本,运行几个月后 ...

  7. SPRING事务的属性有哪些?其中,事务隔离级别有哪几种?什么情况需要使用这几种事务隔离级别?

    Spring 声明式事务,propagation属性列表  PROPAGATION_REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务.这是最常见的选择.  PROPAGATION_SU ...

  8. 关于Linux和Unix的分析

    Linux操作系统即linux.  Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户.多任务.支持多线程和多CPU的操作系统.它能运行主要的UNIX工具软 ...

  9. MySQL运维工具

    Mysql运维过程中设计的各类工具以及各个场景的的命令行的分类.大体总结如下的xmind图片(.xmind附件 加 Q1123654342). 大体上分为: 实例管理工具.高可用工具.慢日志查询工具. ...

  10. 影响Sql server性能的因素

    目前本人在看<SQL Server性能调优实战> ,以下内容是本人看书笔记 数据库性能取决于各方面综合因素: 硬件,操作系统,软件 硬件:内存,CPU,磁盘 当服务器的物理内存不足时,会产 ...