如何优雅的写出一个完整的测试用例

springboot-测试用例

UcApplicationTests启动类

package com.izkml.mlyun.uc;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class UcApplicationTests {

    @Test
    public void contextLoads() {
    }

}

ControllerTestBase基础类

package com.izkml.mlyun.uc.user.controller;

import com.izkml.mlyun.uc.UcApplicationTests;
import org.junit.Before;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.boot.web.server.LocalServerPort;

import java.net.URL;

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public abstract class ControllerTestBase extends UcApplicationTests {
    @LocalServerPort
    protected int port;
    @Autowired
    protected TestRestTemplate template;
    protected URL base;

    protected abstract String getPath();

    @Before
    public void setUp() throws Exception {
        this.base = new URL("http://localhost:" + port + getPath());
    }
}

DeptControllerTest测试类

package com.izkml.mlyun.uc.user.controller;

import com.izkml.mlyun.framework.common.result.JsonResult;
import com.zkml.common.util.JsonUtil;
import org.junit.Test;
import org.springframework.http.*;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static org.junit.Assert.*;

/**
 * Created by fanghui on 2019/11/12.
 */
public class DeptControllerTest extends ControllerTestBase {

    @Override
    protected String getPath() {
        return "/dept";
    }

    @Test
    public void insert() throws Exception {
        String url = base + "";
        Map<String, Object> paramMap = buildParam("单元测试部门1688", "测试1", "1", "18110275751", "1");
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
        HttpEntity<String> httpEntity = new HttpEntity(JsonUtil.getJsonString(paramMap), headers);
        ResponseEntity response = template.postForEntity(url, httpEntity, JsonResult.class);
        System.out.println(response.getBody());
    }

    @Test
    public void bachInsert() throws Exception {
        String url = base + "/batchInsert";
        List<Map<String, Object>> paramMapList = new ArrayList<>();
        paramMapList.add(buildParam("单元测试部门1488", "测试1", "1", "18110275751", "1"));
        paramMapList.add(buildParam("单元测试部门1499", "测试2", "1", "18110275751", "1"));
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
        HttpEntity<String> httpEntity = new HttpEntity(JsonUtil.getJsonString(paramMapList), headers);
        ResponseEntity response = template.postForEntity(url, httpEntity, JsonResult.class);
        System.out.println(response.getBody());
    }

    private Map<String, Object> buildParam(String name, String orgId, String parentId, String fixedPhone, String sort) {
        Map<String, Object> paramMap = new HashMap<>();
        paramMap.put("name", name);
        paramMap.put("orgId", orgId);
        paramMap.put("parentId", parentId);
        paramMap.put("fixedPhone", fixedPhone);
        paramMap.put("sort", sort);
        return paramMap;
    }

    @Test
    public void update() throws Exception {
        String url = base + "";
        Map<String, Object> paramMap = new HashMap<>();
        paramMap.put("id", "bmJwwK4zTZOLBJHjS7A");
        paramMap.put("fixedPhone", "22222");
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
        HttpEntity<String> httpEntity = new HttpEntity(JsonUtil.getJsonString(paramMap), headers);
        ResponseEntity response = template.exchange(url, HttpMethod.PUT, httpEntity, JsonResult.class);
        System.out.println(response.getBody());
    }

    @Test
    public void logicDelete() throws Exception {
        String url = base + "/logicDelete/bmJwwK4zTZOLBJHjS7A";
        Map<String, Object> paramMap = new HashMap<>();
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
        HttpEntity<String> httpEntity = new HttpEntity(JsonUtil.getJsonString(paramMap), headers);
        ResponseEntity response = template.exchange(url, HttpMethod.POST, httpEntity, JsonResult.class);
        System.out.println(response.getBody());
    }

    @Test
    public void findDeptTree() {
        String url = base + "/findDeptTree?orgId=12323";
        Map<String, Object> paramMap = new HashMap<>();
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
        HttpEntity<String> httpEntity = new HttpEntity(JsonUtil.getJsonString(paramMap), headers);
        ResponseEntity response = template.exchange(url, HttpMethod.GET, httpEntity, JsonResult.class);
        System.out.println(response.getBody());
    }
}

springboot-controller测试用例

UcApplicationTests启动类

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class UcApplicationTests {

   @Test
   public void contextLoads() {
   }
}

ControllerTestBase基础类

import com.izkml.mlyun.uc.UcApplicationTests;
import org.junit.Before;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.boot.web.server.LocalServerPort;

import java.net.URL;

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public abstract class ControllerTestBase extends UcApplicationTests {
    @LocalServerPort
    protected int port;
    @Autowired
    protected TestRestTemplate template;
    protected URL base;

    protected abstract String getPath();

    @Before
    public void setUp() throws Exception {
        this.base = new URL("http://localhost:" + port + getPath());
    }
}

测试类

import com.izkml.mlyun.framework.common.result.JsonResult;
import com.zkml.common.util.JsonUtil;
import org.junit.Test;
import org.springframework.http.*;

import java.util.HashMap;
import java.util.Map;

/**
 * Created by fanghui on 2019/11/12.
 */
public class DeptControllerTest extends ControllerTestBase {

    @Override
    protected String getPath() {
        return "/dept";
    }

    @Test
    public void insert() throws Exception {
        String url = base + "";
        Map<String, Object> paramMap = new HashMap<>();
        paramMap.put("name", "单元测试部门");
        paramMap.put("orgId", "测试");
        paramMap.put("parentId", "1");
        paramMap.put("fixedPhone", "18110275751");
        paramMap.put("sort", "1");
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
        HttpEntity<String> httpEntity = new HttpEntity(JsonUtil.getJsonString(paramMap), headers);
        ResponseEntity response = template.postForEntity(url, httpEntity, JsonResult.class);
        System.out.println(response.getBody());
    }
    
    
    @Test
public void update() throws Exception {
    String url = base + "";
    Map<String, Object> paramMap = new HashMap<>();
    paramMap.put("id", "bmJwwK4zTZOLBJHjS7A");
    paramMap.put("fixedPhone", "22222");
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
    HttpEntity<String> httpEntity = new HttpEntity(JsonUtil.getJsonString(paramMap), headers);
    ResponseEntity response = template.exchange(url, HttpMethod.PUT, httpEntity, JsonResult.class);
    System.out.println(response.getBody());
}

@Test
public void logicDelete() throws Exception {
    String url = base + "/logicDelete/bmJwwK4zTZOLBJHjS7A";
    Map<String, Object> paramMap = new HashMap<>();
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
    HttpEntity<String> httpEntity = new HttpEntity(JsonUtil.getJsonString(paramMap), headers);
    ResponseEntity response = template.exchange(url, HttpMethod.POST, httpEntity, JsonResult.class);
    System.out.println(response.getBody());
}

@Test
public void findDeptTree() {
    String url = base + "/findDeptTree?orgId=12323";
    Map<String, Object> paramMap = new HashMap<>();
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
    HttpEntity<String> httpEntity = new HttpEntity(JsonUtil.getJsonString(paramMap), headers);
    ResponseEntity response = template.exchange(url, HttpMethod.GET, httpEntity, JsonResult.class);
    System.out.println(response.getBody());
}

@Test
public void get() throws Exception {
    String url = base + "/get?id=" + "1";
    ResponseEntity response = template.getForEntity(url, String.class);
    System.out.println(response.getBody().toString());
}

时间测试类

package com.izkml.mlyun.uc.user.controller;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import com.izkml.mlyun.framework.database.model.MLBaseModel;
import com.izkml.mlyun.framework.database.mybatis.registermapper.MLBaseMapper;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.apache.ibatis.annotations.Update;
import org.apache.ibatis.logging.nologging.NoLoggingImpl;
import org.junit.After;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.modelmapper.ModelMapper;
import org.modelmapper.convention.MatchingStrategies;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.Configuration;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import tk.mybatis.mapper.mapperhelper.MapperHelper;

import javax.annotation.PostConstruct;
import javax.persistence.Table;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.Map;

/**
 * 测试LocalDateTime controller接收、
 */
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
@Transactional //支持事物,@SpringBootTest 事务默认自动回滚
@Rollback
@Configuration //这里必须加,要不然内部的@Controller等无法被扫描,或者可以实现ImportBeanDefinitionRegistrar接口进行手动注册
public class DateTest {

    public static final String TIME = "2019-12-03 16:52:59";

    public static final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    @Autowired
    DateServiceTest dateServiceTest;

    @Test
    public void test() throws Exception {
        requestTest();
        copyTest();
        dbTest();
    }

    @After
    public void after() {
        System.out.println("启动数据库事务回滚,不留一点痕迹");
    }

    private void dbTest() {
        dateServiceTest.createTable();
        DateModel dateModel = new DateModel();
        dateModel.setDate(LocalDateTime.parse(TIME, dateTimeFormatter));
        dateModel.setUserId("2");
        dateModel.setId("1");
        dateServiceTest.insert(dateModel);
        dateModel = dateServiceTest.get(dateModel.getId());
        equalTime(dateModel.getDate());
        System.out.println("存取DB正常" + dateModel);
    }

    private void requestTest() {
        System.out.println("----------测试controller使用LocalDateTime接收返回时间参数----------");
        String url = "http://localhost:8202";
        Map<String, Object> paramMap = new HashMap<>();
        paramMap.put("date", TIME);
        paramMap.put("userId", "1");

        //requestBody 请求
        DateModel dateModel = new RestTemplate().postForObject(url + "/dateTest-RequestBody", paramMap, DateModel.class);
        equalTime(dateModel.getDate());
        System.out.println("requestBody接收返回LocalDateTime正常" + dateModel);

        //Get 请求
        paramMap.put("userId", "2");
        dateModel = new RestTemplate().getForObject(url + "/dateTest-GET?date={date}&userId={userId}", DateModel.class, paramMap);
        equalTime(dateModel.getDate());
        System.out.println("Get接收返回LocalDateTime正常" + dateModel);

        //post 请求
        HttpHeaders headers = new HttpHeaders();
        LinkedMultiValueMap<String, String> multiValueMap = new LinkedMultiValueMap<String, String>();
        multiValueMap.add("date", TIME);
        multiValueMap.add("userId", "3");
        headers.setContentType(MediaType.MULTIPART_FORM_DATA);
        HttpEntity<LinkedMultiValueMap<String, String>> httpEntity = new HttpEntity(multiValueMap, headers);
        dateModel = new RestTemplate().postForObject(url + "/dateTest-POST", httpEntity, DateModel.class);
        equalTime(dateModel.getDate());
        System.out.println("post接收返回LocalDateTime正常" + dateModel);
    }

    private void copyTest() {
        System.out.println("----------测试使用ModelMapper copy LocalDateTime----------");
        ModelMapper modelMapper = new ModelMapper();
        modelMapper.getConfiguration().setFullTypeMatchingRequired(true);
        modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT);

        DateModel dateModel = new DateModel();
        dateModel.setDate(LocalDateTime.parse(TIME, dateTimeFormatter));
        dateModel.setUserId("1");

        DateModelCopy dateModelCopy = modelMapper.map(dateModel, DateModelCopy.class);
        equalTime(dateModelCopy.getDate());

        System.out.println("ModelMapper copy LocalDateTime 成功");
        System.out.println("resource " + dateModel + "---------target" + dateModelCopy);
    }

    private void equalTime(LocalDateTime localDateTime) {
        Assert.assertEquals(localDateTime.format(dateTimeFormatter), TIME);
    }

    @RestController
    public static class DateControllerTest {

        @PostMapping("/dateTest-RequestBody")
        public DateModel dateTestRequestBody(@RequestBody DateModel dateModel) {
            return dateModel;
        }

        @GetMapping("/dateTest-GET")
        public DateModel dateTestGet(DateModel dateModel) {
            return dateModel;
        }

        @PostMapping("/dateTest-POST")
        public DateModel dateTest(DateModel dateModel) {
            return dateModel;
        }
    }

    @Service
    public static class DateServiceTest {
        private DateTestMapper dateTestMapper;

        @Autowired
        SqlSessionTemplate sqlSessionTemplate;

        private MapperHelper mapperHelper = new MapperHelper();

        @PostConstruct
        public void init() {
            sqlSessionTemplate.getConfiguration().setLogImpl(NoLoggingImpl.class);
            sqlSessionTemplate.getConfiguration().addMapper(DateTestMapper.class);
            mapperHelper.registerMapper(DateTestMapper.class);

            //这里是个bug,在configuration.addMapper里面添加MapperStatement id的组装方式
            // final String mappedStatementId = type.getName() + "." + method.getName();
            //最终 id = com.izkml.mlyun.uc.user.controller.DateControllerTest$DateTestMapper.selectOne 注意有个$

            //在processConfiguration中 id的组装方式mapperInterface.getCanonicalName()
            //最终 id = com.izkml.mlyun.uc.user.controller.DateControllerTest.DateTestMapper $变成了.

            //这里可以选择改写mapperHelper.processConfiguration 或者使用 mapperHelper.processConfiguration(Configuration configuration)
            //mapperHelper.processConfiguration(sqlSessionTemplate.getConfiguration(),DateTestMapper.class);
            mapperHelper.processConfiguration(sqlSessionTemplate.getConfiguration());
            dateTestMapper = sqlSessionTemplate.getMapper(DateTestMapper.class);
        }

        public void createTable() {
            System.out.println("初始化date_test表");
            dateTestMapper.createTable();
        }

        public void insert(DateModel dateModel) {
            dateTestMapper.insert(dateModel);
        }

        public DateModel get(String id) {
            return dateTestMapper.selectByPrimaryKey(id);
        }
    }

    @Getter
    @Setter
    @ToString
    @Table(name = "date_test")
    public static class DateModel extends MLBaseModel<String> {

        @ApiModelProperty(value = "更新时间", hidden = true)
        @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
        @JsonSerialize(using = LocalDateTimeSerializer.class)
        @JsonDeserialize(using = LocalDateTimeDeserializer.class, as = LocalDateTime.class)
        private LocalDateTime date;

        private String userId;
    }

    @Getter
    @Setter
    @ToString
    public static class DateModelCopy {

        @ApiModelProperty(value = "更新时间", hidden = true)
        @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
        @JsonSerialize(using = LocalDateTimeSerializer.class)
        @JsonDeserialize(using = LocalDateTimeDeserializer.class, as = LocalDateTime.class)
        private LocalDateTime date;

        private String userId;
    }

    public interface DateTestMapper extends MLBaseMapper<DateModel> {
        @Update("CREATE TABLE if not exists `date_test` (" +
                "  `id` VARCHAR(80) NOT NULL," +
                "  `user_id` VARCHAR(80) NOT NULL," +
                "  `date` DATETIME DEFAULT NULL," +
                "  `created_by` VARCHAR(255) CHARACTER SET utf8 DEFAULT NULL," +
                "  `updated_by` VARCHAR(255) CHARACTER SET utf8 DEFAULT NULL," +
                "  `created_at` DATETIME DEFAULT NULL," +
                "  `updated_at` DATETIME DEFAULT NULL," +
                "  PRIMARY KEY (`id`)" +
                ") ENGINE=INNODB DEFAULT CHARSET=utf8mb4")
        void createTable();
    }
}
posted @ 2020-08-05 10:28  荭丶尘  阅读(256)  评论(0编辑  收藏  举报