homepage 第四期:微服务功能实现及相关测试

本贴最后更新于 2069 天前,其中的信息可能已经时移世易

1.建立 courseInfo 服务接口

package cn.chenforcode.homepage.service; import cn.chenforcode.homepage.CourseInfo; import cn.chenforcode.homepage.CourseInfosRequest; import java.util.List; public interface ICourseService { /** * @Author <a href="http://www.chenforcode.cn">PKUCoder</a> * @Date 2019/11/11 7:27 下午 * @Param [id] * @Return cn.chenforcode.homepage.CourseInfo * @Description 根据id获取一个courseInfo **/ CourseInfo getCourseInfo(Long id); /** * @Author <a href="http://www.chenforcode.cn">PKUCoder</a> * @Date 2019/11/11 7:27 下午 * @Param [courseInfosRequest] * @Return java.util.List<cn.chenforcode.homepage.CourseInfo> * @Description 根据一个courseInfoRequest对象得到一个courseInfo的list **/ List<CourseInfo> getCourseInfos(CourseInfosRequest courseInfosRequest); }

2.完成对应的实现类

package cn.chenforcode.homepage.service.impl; import cn.chenforcode.homepage.CourseInfo; import cn.chenforcode.homepage.CourseInfosRequest; import cn.chenforcode.homepage.entity.HomepageCourse; import cn.chenforcode.homepage.repository.HomepageCourseRepository; import cn.chenforcode.homepage.service.ICourseService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import java.util.Collections; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; /** * @author <a href="http://www.chenforcode.cn">PKUCoder</a> * @date 2019/11/11 7:28 下午 * @description ICourseService接口实现类 */ @Slf4j @Service public class CourseServiceImpl implements ICourseService { @Autowired private HomepageCourseRepository homepageCourseRepository; @Override public CourseInfo getCourseInfo(Long id) { Optional<HomepageCourse> course = homepageCourseRepository.findById(id); //这句话的意思是传入一个homepageCourse对象,然后构造出来一个courseInfo并返回。如果course对象是空的就用invalid //方法的到的一个无效对象进行代替 return buildCourseInfo(course.orElse(HomepageCourse.invalid())); } @Override public List<CourseInfo> getCourseInfos(CourseInfosRequest courseInfosRequest) { //如果request里边的id列表是空的,那么就返回一个空的列表 if (CollectionUtils.isEmpty(courseInfosRequest.getIds())) { return Collections.emptyList(); } //否则就进行查询 List<HomepageCourse> courses = homepageCourseRepository.findAllById(courseInfosRequest.getIds()); return courses.stream() .map(this::buildCourseInfo) .collect(Collectors.toList()); } /** * @Author <a href="http://www.chenforcode.cn">PKUCoder</a> * @Date 2019/11/11 7:46 下午 * @Param [course] * @Return cn.chenforcode.homepage.CourseInfo * @Description 根据传入的一个course构造出来一个courseInfo **/ private CourseInfo buildCourseInfo(HomepageCourse course) { return CourseInfo.builder() .id(course.getId()) .courseName(course.getCourseName()) .courseType(course.getCourseType() == 0 ? "免费课程":"收费课程") .courseIcon(course.getCourseIcon()) .courseIntro(course.getCourseIntro()) .build(); } }

3.完成 controller

package cn.chenforcode.homepage.controller; import cn.chenforcode.homepage.CourseInfo; import cn.chenforcode.homepage.CourseInfosRequest; import cn.chenforcode.homepage.service.ICourseService; import com.alibaba.fastjson.JSON; import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; 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 java.util.List; /** * @author <a href="http://www.chenforcode.cn">PKUCoder</a> * @date 2019/11/11 7:48 下午 * @description 课程对外服务接口 */ @Slf4j @RestController public class HomepageCourseController { @Autowired private ICourseService courseService; @GetMapping("/get/course") public CourseInfo getCourseInfo(Long id) { log.info("<homepage-course>: get course -> {}", id); return courseService.getCourseInfo(id); } @PostMapping("/get/courses") public List<CourseInfo> getCourseInfos(@RequestBody CourseInfosRequest request) { log.info("<homepage-course>: get courses -> {}", JSON.toJSONString(request)); return courseService.getCourseInfos(request); } }

4.对 service 进行测试,首先建立测试环境
@1 在 test 目录下建立 resources 目录,并标记为 test resources root,将 main 目录下的配置文件拷贝进来
@2 建立 Application 启动类

package cn.chenforcode.homepage; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * @author <a href="http://www.chenforcode.cn">PKUCoder</a> * @date 2019/11/11 8:00 下午 * @description 测试用例启动类 */ @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }

@3.编写测试

package cn.chenforcode.homepage.service; import cn.chenforcode.homepage.Application; import cn.chenforcode.homepage.CourseInfosRequest; import cn.chenforcode.homepage.entity.HomepageCourse; import cn.chenforcode.homepage.repository.HomepageCourseRepository; import com.alibaba.fastjson.JSON; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import java.util.Arrays; /** * @author <a href="http://www.chenforcode.cn">PKUCoder</a> * @date 2019/11/11 9:13 下午 * @description homepageCourseService的测试类 */ @SpringBootTest(classes = {Application.class}, webEnvironment = SpringBootTest.WebEnvironment.NONE) @RunWith(SpringRunner.class) public class HomepageCourseServiceTest { @Autowired private HomepageCourseRepository courseRepository; @Autowired private ICourseService courseService; // @Test public void testCreateCourseInfo() { HomepageCourse course1 = new HomepageCourse( "JDK11&12 新特性解读", 0, "http://www.chenforcode.cn", "解读JDK11&12的新特性"); HomepageCourse course2 = new HomepageCourse( "基于SpringCloud的广告系统的实现", 1, "http://www.chenforcode.cn", "基于SpringCloud微服务架构的广告系统的实现"); System.out.println(courseRepository.saveAll(Arrays.asList(course1, course2)).size()); } @Test public void testGetCourseInfo() { System.out.println(JSON.toJSONString( courseService.getCourseInfo(6L) )); System.out.println(JSON.toJSONString( courseService.getCourseInfo(8L) )); } @Test public void testGetCourseInfos() { System.out.println(JSON.toJSONString( courseService.getCourseInfos( new CourseInfosRequest(Arrays.asList(8L, 9L)) ) )); } }
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3201 引用 • 8217 回帖
  • 云计算
    80 引用 • 93 回帖 • 1 关注
  • homepage系列
    7 引用

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • SQLServer

    SQL Server 是由 [微软] 开发和推广的关系数据库管理系统(DBMS),它最初是由 微软、Sybase 和 Ashton-Tate 三家公司共同开发的,并于 1988 年推出了第一个 OS/2 版本。

    21 引用 • 31 回帖 • 1 关注
  • Typecho

    Typecho 是一款博客程序,它在 GPLv2 许可证下发行,基于 PHP 构建,可以运行在各种平台上,支持多种数据库(MySQL、PostgreSQL、SQLite)。

    12 引用 • 67 回帖 • 445 关注
  • V2Ray
    1 引用 • 15 回帖 • 4 关注
  • GAE

    Google App Engine(GAE)是 Google 管理的数据中心中用于 WEB 应用程序的开发和托管的平台。2008 年 4 月 发布第一个测试版本。目前支持 Python、Java 和 Go 开发部署。全球已有数十万的开发者在其上开发了众多的应用。

    14 引用 • 42 回帖 • 824 关注
  • Firefox

    Mozilla Firefox 中文俗称“火狐”(正式缩写为 Fx 或 fx,非正式缩写为 FF),是一个开源的网页浏览器,使用 Gecko 排版引擎,支持多种操作系统,如 Windows、OSX 及 Linux 等。

    7 引用 • 30 回帖 • 377 关注
  • 房星科技

    房星网,我们不和没有钱的程序员谈理想,我们要让程序员又有理想又有钱。我们有雄厚的房地产行业线下资源,遍布昆明全城的 100 家门店、四千地产经纪人是我们坚实的后盾。

    6 引用 • 141 回帖 • 610 关注
  • SQLite

    SQLite 是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是全世界使用最为广泛的数据库引擎。

    4 引用 • 7 回帖
  • NetBeans

    NetBeans 是一个始于 1997 年的 Xelfi 计划,本身是捷克布拉格查理大学的数学及物理学院的学生计划。此计划延伸而成立了一家公司进而发展这个商用版本的 NetBeans IDE,直到 1999 年 Sun 买下此公司。Sun 于次年(2000 年)六月将 NetBeans IDE 开源,直到现在 NetBeans 的社群依然持续增长。

    78 引用 • 102 回帖 • 713 关注
  • Ant-Design

    Ant Design 是服务于企业级产品的设计体系,基于确定和自然的设计价值观上的模块化解决方案,让设计者和开发者专注于更好的用户体验。

    17 引用 • 23 回帖 • 2 关注
  • flomo

    flomo 是新一代 「卡片笔记」 ,专注在碎片化时代,促进你的记录,帮你积累更多知识资产。

    6 引用 • 143 回帖
  • Solo

    Solo 是一款小而美的开源博客系统,专为程序员设计。Solo 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    1444 引用 • 10083 回帖 • 508 关注
  • 安装

    你若安好,便是晴天。

    132 引用 • 1184 回帖
  • 创业

    你比 99% 的人都优秀么?

    81 引用 • 1395 回帖
  • BAE

    百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。

    19 引用 • 75 回帖 • 682 关注
  • RemNote
    2 引用 • 16 回帖 • 26 关注
  • Chrome

    Chrome 又称 Google 浏览器,是一个由谷歌公司开发的网页浏览器。该浏览器是基于其他开源软件所编写,包括 WebKit,目标是提升稳定性、速度和安全性,并创造出简单且有效率的使用者界面。

    63 引用 • 289 回帖
  • BND

    BND(Baidu Netdisk Downloader)是一款图形界面的百度网盘不限速下载器,支持 Windows、Linux 和 Mac,详细介绍请看这里

    107 引用 • 1281 回帖 • 36 关注
  • 程序员

    程序员是从事程序开发、程序维护的专业人员。

    591 引用 • 3528 回帖 • 1 关注
  • 学习

    “梦想从学习开始,事业从实践起步” —— 习近平

    172 引用 • 540 回帖
  • Tomcat

    Tomcat 最早是由 Sun Microsystems 开发的一个 Servlet 容器,在 1999 年被捐献给 ASF(Apache Software Foundation),隶属于 Jakarta 项目,现在已经独立为一个顶级项目。Tomcat 主要实现了 JavaEE 中的 Servlet、JSP 规范,同时也提供 HTTP 服务,是市场上非常流行的 Java Web 容器。

    162 引用 • 529 回帖 • 8 关注
  • SEO

    发布对别人有帮助的原创内容是最好的 SEO 方式。

    36 引用 • 200 回帖 • 38 关注
  • WiFiDog

    WiFiDog 是一套开源的无线热点认证管理工具,主要功能包括:位置相关的内容递送;用户认证和授权;集中式网络监控。

    1 引用 • 7 回帖 • 615 关注
  • Visio
    1 引用 • 2 回帖 • 1 关注
  • 运维

    互联网运维工作,以服务为中心,以稳定、安全、高效为三个基本点,确保公司的互联网业务能够 7×24 小时为用户提供高质量的服务。

    151 引用 • 257 回帖
  • Gzip

    gzip (GNU zip)是 GNU 自由软件的文件压缩程序。我们在 Linux 中经常会用到后缀为 .gz 的文件,它们就是 Gzip 格式的。现今已经成为互联网上使用非常普遍的一种数据压缩格式,或者说一种文件格式。

    9 引用 • 12 回帖 • 184 关注
  • 深度学习

    深度学习(Deep Learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。

    43 引用 • 44 回帖 • 1 关注
  • JWT

    JWT(JSON Web Token)是一种用于双方之间传递信息的简洁的、安全的表述性声明规范。JWT 作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以 JSON 的形式安全的传递信息。

    20 引用 • 15 回帖 • 27 关注