IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> 日志模块服务端关键业务2(PROJECT02_DAY04_01) -> 正文阅读

[开发测试]日志模块服务端关键业务2(PROJECT02_DAY04_01)

第五步:单元测试类SysLogDaoTests,对数据层方法进行测试。

package com.cy.pj.sys.dao;

import java.util.List;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import com.cy.pj.sys.entity.SysLog;

@SpringBootTest
public class SysLogDaoTests {
	@Autowired
	private SysLogDao sysLogDao;     

	@Test
	public void testGetRowCount() {
		int rows=sysLogDao.getRowCount("admin");
		System.out.println("rows="+rows);
	 }
	@Test
	public void testFindPageObjects() {
		List<SysLog> list = sysLogDao.findPageObjects("admin", 0, 3);
		for(SysLog log:list) {
			System.out.println(log);
		 }
	 }
}

3.3.2 Service接口及实现类

  • 业务描述与设计实现

业务层主要是实现模块中业务逻辑的处理。在日志分页查询中,业务层对象首先要通过业务方法中的参数接收控制层数据(例如username,pageCurrent)并校验。然后基于用户名进行总记录数的查询并校验,再基于起始位置及页面大小进行当前页记录的查询,最后对查询结果进行封装并返回。

  • 关键代码设计及实现

业务值对象定义,基于此对象封装数据层返回的数据以及计算的分页信息,具体代码参考如下:

package com.cy.pj.common.vo;
/**借助此对象封装数据层返回的分页查询结果,并计算分析信息*/
@Data 
@NoArgsConstructor
public class PageObject<T> implements Serializable {
    private static final long serialVersionUID = 6780580291247550747L;//类泛型
    /**当前页的页码值*/
    private Integer pageCurrent=1;
    /**页面大小*/
    private Integer pageSize=3;
    /**总行数(通过查询获得)*/
    private Integer rowCount=0;
    /**总页数(通过计算获得)*/
    private Integer pageCount=0;
    /**当前页记录*/
    private List<T> records;
	public PageObject(){}
        public PageObject(Integer pageCurrent, Integer pageSize, Integer rowCount, List<T> records) {
                super();
                this.pageCurrent = pageCurrent;
                this.pageSize = pageSize;
                this.rowCount = rowCount;
                this.records = records;
//                this.pageCount=rowCount/pageSize;
//                if(rowCount%pageSize!=0) {
//                        pageCount++;
//                }
                this.pageCount=(rowCount-1)/pageSize+1;
        }

定义日志业务接口及方法,暴露外界对日志业务数据的访问,其代码参考如下:

package com.cy.pj.sys.service;
public interface SysLogService {
    /**
      * @param name 基于条件查询时的参数名
      * @param pageCurrent 当前的页码值
      * @return 当前页记录+分页信息
      */
      PageObject<SysLog> findPageObjects(
                        String username,
                        Long pageCurrent);
}

测试Long 类型是否有整数池的概念:

package com.cy.pj.sys.service;

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class IntegerPoolTests {
	@Test
	public void testIntegerCache() {
		Integer t1 = 100;
		Integer t2 = 100;
		//对于Integer来说会有一个整数池(-128~127)
		System.out.println(t1 == t2);//true
		Integer t3 = 200;
		Integer t4 = 200;
		System.out.println(t3 == t4);//false
	}

	@Test
	public void testLongCache() {
		Long t1 = 100L;
		Long t2 = 100L;
		//对于Long来说会有一个整数池(-128~127)
		System.out.println(t1 == t2);
		Long t3 = 200L;
		Long t4 = 200L;
		System.out.println(t3 == t4);              
	}
}

日志业务接口及实现类,用于具体执行日志业务数据的分页查询操作,其代码如下:

package com.cy.pj.sys.service.impl;

@Service
public class SysLogServiceImpl implements SysLogService{

     @Autowired
     private SysLogDao sysLogDao;
     
     @Override
     public PageObject<SysLog> findPageObjects(String name, Integer pageCurrent) {
     	//1.验证参数合法性
        //1.1验证pageCurrent的合法性,
        //不合法抛出IllegalArgumentException异常
        if(pageCurrent==null||pageCurrent<1)
                  throw new IllegalArgumentException("当前页码不正确");
        //2.基于条件查询总记录数
        //2.1) 执行查询
        int rowCount=sysLogDao.getRowCount(name);
        //2.2) 验证查询结果,假如结果为0不再执行如下操作
        if(rowCount==0)
          throw new ServiceException("系统没有查到对应记录");
        //3.基于条件查询当前页记录(pageSize定义为2)
        //3.1)定义pageSize
        int pageSize=2;
        //3.2)计算startIndex
        int startIndex=(pageCurrent-1)*pageSize;
        //3.3)执行当前数据的查询操作
        List<SysLog> records=
        sysLogDao.findPageObjects(name, startIndex, pageSize);
        //4.对分页信息以及当前页记录进行封装
        //4.1)构建PageObject对象
        PageObject<SysLog> pageObject=new PageObject<>();
        //4.2)封装数据
        return new PageObject<>(pageCurrent, pageSize,rowCount, records);
     }
}

在当前方法中需要的ServiceException是一个自己定义的异常, 通过自定义异常可更好的实现对业务问题的描述,同时可以更好的提高用户体验。参考代码如下:

package com.cy.pj.common.exception;

public class ServiceException extends RuntimeException {
        private static final long serialVersionUID = 7793296502722655579L;
        public ServiceException() {
                super();
        }
        public ServiceException(String message) {
                super(message);
                // TODO Auto-generated constructor stub
        }
        public ServiceException(Throwable cause) {
                super(cause);
                // TODO Auto-generated constructor stub
        }
}

说明:几乎在所有的框架中都提供了自定义异常,例如MyBatis中的BindingException等。

定义Service对象的单元测试类,代码如下:

package com.cy.pj.sys.service;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import com.cy.pj.common.vo.PageObject;
import com.cy.pj.sys.entity.SysLog;

@SpringBootTest
public class SysLogServiceTests {

        @Autowired
        private SysLogService sysLogService;
        @Test
        public void testFindPageObjects() {
           PageObject<SysLog> pageObject = sysLogService.findPageObjects("admin", 3L);
           System.out.println(pageObject);           
        }
}

Controller类实现

  • 业务描述与设计实现

控制层对象主要负责请求和响应数据的处理,例如,本模块首先要通过控制层对象处理请求参数,然后通过业务层对象执行业务逻辑,再通过VO对象封装响应结果(主要对业务层数据添加状态信息),最后将响应结果转换为JSON格式的字符串响应到客户端。

  • 关键代码设计与实现

定义控制层值对象(VO),目的是基于此对象封装控制层响应结果(在此对象中主要是为业务层执行结果添加状态信息)。Spring MVC框架在响应时可以调用相关API(例如jackson)将其对象转换为JSON格式字符串。

package com.cy.pj.common.vo;
@Data
public class JsonResult implements Serializable {
        private static final long serialVersionUID = -856924038217431339L;

        /**状态码*/
        private int state=1;//1表示SUCCESS,0表示ERROR
        /**状态信息*/
        private String message="ok";
        /**正确数据*/
        private Object data;
        public JsonResult() {}
        public JsonResult(String message){
                this.message=message;
        }
        /**一般查询时调用,封装查询结果*/
        public JsonResult(Object data) {
                this.data=data;
        }
        /**出现异常时时调用*/
        public JsonResult(Throwable t){
                this.state=0;
                this.message=t.getMessage();
        }
}

定义Controller类,并将此类对象使用Spring框架中的@Controller注解进行标识,表示此类对象要交给Spring管理。然后基于@RequestMapping注解为此类定义根路径映射。代码参考如下:

package com.cy.pj.sys.controller;

@Controller
@RequestMapping("/log/")
public class SysLogController {
        @Autowired
        private SysLogService sysLogService;
}

在Controller类中添加分页请求处理方法,代码参考如下:

@RequestMapping("doFindPageObjects")
@ResponseBody
public JsonResult doFindPageObjects(String username,Integer pageCurrent){
	PageObject<SysLog> pageObject =  sysLogService.findPageObjects(username,pageCurrent);
	return new JsonResult(pageObject);
}

定义全局异常处理类,对控制层可能出现的异常,进行统一异常处理,代码如下:

package com.cy.pj.common.web;

import java.util.logging.Logger;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import com.cy.pj.common.vo.JsonResult;

@ControllerAdvice
public class GlobalExceptionHandler {
   //JDK中的自带的日志API
   @ExceptionHandler(RuntimeException.class)
   @ResponseBody
   public JsonResult doHandleRuntimeException(RuntimeException e){
   		e.printStackTrace();//也可以写日志异常信息
   }
        return new JsonResult(e);//封装
}
  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2021-09-11 19:06:55  更:2021-09-11 19:08:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/18 0:25:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码