实战SSM_O2O商铺_05集成SSM后验证DAO层、Service层、Controller层的配置

简介: 实战SSM_O2O商铺_05集成SSM后验证DAO层、Service层、Controller层的配置

2019120810303418.png

概述


整合SSM框架之后,我们分别对持久层、业务层、控制层分别做下单元测试。

Area这个实体类属性相对较少,我们就选择使用Area来测试吧。

首先为tb_area表准备2条数据

-- ----------------------------
-- Records of tb_area
-- ----------------------------
INSERT INTO `tb_area` VALUES ('1', '北京', '帝都', '0', '2018-05-13 21:00:26', '2018-05-14 21:00:33');
INSERT INTO `tb_area` VALUES ('2', '上海', '魔都', '99', '2018-05-13 21:00:36', '2018-05-14 21:00:41');


验证DAO层的配置


2018051511472755.png


接口


结合/o2o/src/main/resources/spring/spring-dao.xml中的配置


20180515113348935.png


所以 接口层的类都应该写在com.artisan.o2o.dao包下

AreaDao.java

package com.artisan.o2o.dao;
import java.util.List;
import com.artisan.o2o.entity.Area;
public interface AreaDao {
  List<Area> queryArea();
}



SQL映射文件


结合/o2o/src/main/resources/spring/spring-dao.xml中的配置


2018051511354165.png


所以在/o2o/src/main/resources/mapper目录下 新建映mybatis的SQL映射文件

AreaDao.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.artisan.o2o.dao.AreaDao">
  <select id="queryArea" resultType="Area">
    SELECT
      area_id,
      area_name,
      area_desc,
      priority,
      create_time,
      last_edit_time
    FROM
      tb_area
    ORDER BY
      priority DESC
  </select>
</mapper>   


单元测试


src/test/java目录下新建com.artisan.o2o包,使用spring-test更加方便的进行单元测试。 我们已经在 pom.xml中添加了spring-test的依赖。

创建 Spring Test 的基类,该类主要用来加载配置文件,设置web环境。所有的测试类,都需要继承该类初始化spring信息。


基类


放在com.artisan.o2o目录下,所有的测试类,都需要继承该类初始化spring信息。

package com.artisan.o2o;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
 * 
 * 
 * @ClassName: BaseTest
 * 
 * @Description: 测试类的基类,配置Spring和junit整合,junit启动时加载springIOC容器
 * 
 * @author: Mr.Yang
 * 
 * @date: 2018年5月14日 下午12:58:21
 */
@RunWith(SpringJUnit4ClassRunner.class)
// 告诉junit spring配置文件
@ContextConfiguration({ "classpath:spring/spring-dao.xml", "classpath:spring-service.xml" })
public class BaseTest {
}

DAO层单元测试类

com.artisan.o2o.dao包下建立DAO层的测试类,继承BaseTest

package com.artisan.o2o.dao;
import static org.junit.Assert.assertEquals;
import java.util.List;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import com.artisan.o2o.BaseTest;
import com.artisan.o2o.entity.Area;
/**
 * 
 * 
 * @ClassName: AreaDaoTest
 * 
 * @Description: 集成SSM后对DAO层进行验证
 * 
 * @author: Mr.Yang
 * 
 * @date: 2018年5月14日 下午5:21:49
 */
public class AreaDaoTest extends BaseTest {
  @Autowired
  AreaDao areaDao;
  @Test
  public void testQueryArea() {
    List<Area> areaList = areaDao.queryArea();
    // 插入了2条测试数据,期望list中有2条
    assertEquals(2, areaList.size());
    // SQL中按照权重排序,上海priority 99 ,期望第一条数据是 上海
    System.out.println(areaList.get(0));
    assertEquals("上海", areaList.get(0).getAreaName());
  }
}


单元测试运行正常。

关键日志

JDBC Connection [com.mchange.v2.c3p0.impl.NewProxyConnection@a1f72f5] will not be managed by Spring
==>  Preparing: SELECT area_id, area_name, area_desc, priority, create_time, last_edit_time FROM tb_area ORDER BY priority DESC 
==> Parameters: 
<==    Columns: area_id, area_name, area_desc, priority, create_time, last_edit_time
<==        Row: 2, 上海, 魔都, 99, 2018-05-13 21:00:36.0, 2018-05-14 21:00:41.0
<==        Row: 1, 北京, 帝都, 0, 2018-05-13 21:00:26.0, 2018-05-14 21:00:33.0
<==      Total: 2
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@61710c6]
Area [areaId=2, areaName=上海, areaDesc=魔都, priority=99, createTime=Sun May 13 21:00:36 BOT 2018, lastEditTime=Mon May 14 21:00:41 BOT 2018]


验证Service层的配置



20180515114843553.png


接口以及实现类

接口

package com.artisan.o2o.service;
import java.util.List;
import com.artisan.o2o.entity.Area;
public interface AreaService {
  /**
   * 
   * 
   * @Title: getAreaList
   * 
   * @Description: 获取区域列表
   * 
   * @return
   * 
   * @return: List<Area>
   */
  List<Area> getAreaList();
}


实现类

package com.artisan.o2o.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.artisan.o2o.dao.AreaDao;
import com.artisan.o2o.entity.Area;
import com.artisan.o2o.service.AreaService;
/**
 * 
 * 
 * @ClassName: AreaServiceImpl
 * 
 * @Description: @Service标注的服务层
 * 
 * @author: Mr.Yang
 * 
 * @date: 2018年5月14日 下午9:06:45
 */
@Service
public class AreaServiceImpl implements AreaService {
  @Autowired
  AreaDao areaDao;
  @Override
  public List<Area> getAreaList() {
    return areaDao.queryArea();
  }
}


单元测试类

package com.artisan.o2o.service;
import java.util.List;
import org.junit.Assert;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import com.artisan.o2o.BaseTest;
import com.artisan.o2o.entity.Area;
public class AreaServiceTest extends BaseTest {
  @Autowired
  AreaService areaService;
  @Test
  public void testGetAreaList() {
    List<Area> areaList = areaService.getAreaList();
    Assert.assertEquals("上海", areaList.get(0).getAreaName());
  }
}


BaseTest基类中,别忘了加载classpath:spring-service.xml 配置文件,否则报错。 第一步已经加好了,这里就不重复了。

单元测试运行正常。

关键日志

JDBC Connection [com.mchange.v2.c3p0.impl.NewProxyConnection@a1f72f5] will not be managed by Spring
==>  Preparing: SELECT area_id, area_name, area_desc, priority, create_time, last_edit_time FROM tb_area ORDER BY priority DESC 
==> Parameters: 
<==    Columns: area_id, area_name, area_desc, priority, create_time, last_edit_time
<==        Row: 2, 上海, 魔都, 99, 2018-05-13 21:00:36.0, 2018-05-14 21:00:41.0
<==        Row: 1, 北京, 帝都, 0, 2018-05-13 21:00:26.0, 2018-05-14 21:00:33.0
<==      Total: 2
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@61710c6]
Area [areaId=2, areaName=上海, areaDesc=魔都, priority=99, createTime=Sun May 13 21:00:36 BOT 2018, lastEditTime=Mon May 14 21:00:41 BOT 2018]

验证Controller层的配置


20180515115404690.png

控制层

package com.artisan.o2o.web;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import com.artisan.o2o.entity.Area;
import com.artisan.o2o.service.AreaService;
@Controller
@RequestMapping("/superadmin")
public class AreaController {
  @Autowired
  AreaService areaService;
  @RequestMapping(value = "/listArea", method = RequestMethod.GET)
  @ResponseBody
  public Map<String, Object> getAreas() {
    Map<String, Object> map = new HashMap<String, Object>();
    List<Area> areaList = new ArrayList<Area>();
    try {
      areaList = areaService.getAreaList();
      map.put("total", areaList.size());
      map.put("rows", areaList);
      for (Area area : areaList) {
        System.out.println("区域:" + area);
      }
    } catch (Exception e) {
      e.printStackTrace();
      map.put("success", false);
      map.put("errMsg", e.getMessage().toString());
    }
    return map;
  }
}


启动服务,浏览器访问


访问如下地址:

http://localhost:8080/o2o/superadmin/listArea


为了美化JSON,在浏览器中,更直观的查看JSON,在Chrome中安装了json-handle插件,展示效果如下:


20180515110918577.png


附- 模拟HTTP 请求调测利器Postman


Postman概述


在开发或者调试网络程序或者是网页B/S模式的程序的时候,常常需要跟踪监视网页HTTP请求,测试服务器响应是否正确。


Chrome 浏览器扩展插件:Postman,可以模拟用户 HTTP 请求的数据发送到服务器,方便测试服务器接口。


(1)Postman 是一个 Chrome 扩展,提供功能强大的 API & HTTP 请求调试。

(2)能够发送任何类型的 HTTP requests(GET, HEAD, POST, PUT…),附带任何数量的参数,以及自定义Http 头信息(HTTP Headers)。

(3)支持不同的认证机制(basic, digest, OAuth),接收到的响应语法高亮(HTML,JSON 或 XML)。

(4)能够保留了历史的请求,这样我们就可以很容易地重新发送请求,有一个“集合”功能,用于存储所有请求相同的API/域。

(5)项目地址:https://www.getpostman.com/


Postman安装使用



使用Postman


浏览器中输入 chrome://apps/ , 找到并打开Postman


20180515120908943.png


Github地址


代码地址: https://github.com/yangshangwei/o2o


相关文章
|
3月前
|
人工智能 自然语言处理 API
快速集成GPT-4o:下一代多模态AI实战指南
快速集成GPT-4o:下一代多模态AI实战指南
378 101
|
6月前
|
缓存 监控 安全
通义大模型与现有企业系统集成实战《CRM案例分析与安全最佳实践》
本文档详细介绍了基于通义大模型的CRM系统集成架构设计与优化实践。涵盖混合部署架构演进(新增向量缓存、双通道同步)、性能基准测试对比、客户意图分析模块、商机预测系统等核心功能实现。同时,深入探讨了安全防护体系、三级缓存架构、请求批处理优化及故障处理机制,并展示了实时客户画像生成和动态提示词工程。通过实施,显著提升客服响应速度(425%)、商机识别准确率(37%)及客户满意度(15%)。最后,规划了技术演进路线图,从单点集成迈向自主优化阶段,推动业务效率与价值持续增长。
237 8
|
3月前
|
人工智能 Java API
Java与大模型集成实战:构建智能Java应用的新范式
随着大型语言模型(LLM)的API化,将其强大的自然语言处理能力集成到现有Java应用中已成为提升应用智能水平的关键路径。本文旨在为Java开发者提供一份实用的集成指南。我们将深入探讨如何使用Spring Boot 3框架,通过HTTP客户端与OpenAI GPT(或兼容API)进行高效、安全的交互。内容涵盖项目依赖配置、异步非阻塞的API调用、请求与响应的结构化处理、异常管理以及一些面向生产环境的最佳实践,并附带完整的代码示例,助您快速将AI能力融入Java生态。
484 12
|
3月前
|
存储 缓存 数据处理
孔夫子旧书网开放平台接口实战:古籍图书检索与商铺数据集成
本文详解孔夫子旧书网古籍数据接口的实战调用,涵盖认证签名、古籍检索、商铺集成与特色数据处理四大场景,提供可复用的Python代码及避坑指南,助力学术研究、旧书商管理与古籍数字化落地。
|
4月前
|
人工智能 自然语言处理 分布式计算
AI 驱动传统 Java 应用集成的关键技术与实战应用指南
本文探讨了如何将AI技术与传统Java应用集成,助力企业实现数字化转型。内容涵盖DJL、Deeplearning4j等主流AI框架选择,技术融合方案,模型部署策略,以及智能客服、财务审核、设备诊断等实战应用案例,全面解析Java系统如何通过AI实现智能化升级与效率提升。
339 0
|
7月前
|
人工智能 安全 Shell
Jupyter MCP服务器部署实战:AI模型与Python环境无缝集成教程
Jupyter MCP服务器基于模型上下文协议(MCP),实现大型语言模型与Jupyter环境的无缝集成。它通过标准化接口,让AI模型安全访问和操作Jupyter核心组件,如内核、文件系统和终端。本文深入解析其技术架构、功能特性及部署方法。MCP服务器解决了传统AI模型缺乏实时上下文感知的问题,支持代码执行、变量状态获取、文件管理等功能,提升编程效率。同时,严格的权限控制确保了安全性。作为智能化交互工具,Jupyter MCP为动态计算环境与AI模型之间搭建了高效桥梁。
463 2
Jupyter MCP服务器部署实战:AI模型与Python环境无缝集成教程
|
分布式计算 大数据 Apache
ClickHouse与大数据生态集成:Spark & Flink 实战
【10月更文挑战第26天】在当今这个数据爆炸的时代,能够高效地处理和分析海量数据成为了企业和组织提升竞争力的关键。作为一款高性能的列式数据库系统,ClickHouse 在大数据分析领域展现出了卓越的能力。然而,为了充分利用ClickHouse的优势,将其与现有的大数据处理框架(如Apache Spark和Apache Flink)进行集成变得尤为重要。本文将从我个人的角度出发,探讨如何通过这些技术的结合,实现对大规模数据的实时处理和分析。
875 2
ClickHouse与大数据生态集成:Spark & Flink 实战
|
7月前
|
JSON JavaScript API
MCP 实战:用配置与真实代码玩转 GitHub 集成
MCP 实战:用配置与真实代码玩转 GitHub 集成
1518 4
|
存储 监控 Devops
DevOps实践:持续集成/持续部署(CI/CD)的实战指南
DevOps实践:持续集成/持续部署(CI/CD)的实战指南
|
12月前
|
存储 JavaScript 开发工具
基于HarmonyOS 5.0(NEXT)与SpringCloud架构的跨平台应用开发与服务集成研究【实战】
本次的.HarmonyOS Next ,ArkTS语言,HarmonyOS的元服务和DevEco Studio 开发工具,为开发者提供了构建现代化、轻量化、高性能应用的便捷方式。这些技术和工具将帮助开发者更好地适应未来的智能设备和服务提供方式。
基于HarmonyOS 5.0(NEXT)与SpringCloud架构的跨平台应用开发与服务集成研究【实战】

热门文章

最新文章