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

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

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 技术具有卓越的通用性、高效性、平台移植性和安全性。

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

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • Facebook

    Facebook 是一个联系朋友的社交工具。大家可以通过它和朋友、同事、同学以及周围的人保持互动交流,分享无限上传的图片,发布链接和视频,更可以增进对朋友的了解。

    4 引用 • 15 回帖 • 443 关注
  • Lute

    Lute 是一款结构化的 Markdown 引擎,支持 Go 和 JavaScript。

    29 引用 • 202 回帖 • 33 关注
  • ReactiveX

    ReactiveX 是一个专注于异步编程与控制可观察数据(或者事件)流的 API。它组合了观察者模式,迭代器模式和函数式编程的优秀思想。

    1 引用 • 2 回帖 • 183 关注
  • 996
    13 引用 • 200 回帖 • 2 关注
  • 创造

    你创造的作品可能会帮助到很多人,如果是开源项目的话就更赞了!

    187 引用 • 1021 回帖
  • OkHttp

    OkHttp 是一款 HTTP & HTTP/2 客户端库,专为 Android 和 Java 应用打造。

    16 引用 • 6 回帖 • 95 关注
  • 强迫症

    强迫症(OCD)属于焦虑障碍的一种类型,是一组以强迫思维和强迫行为为主要临床表现的神经精神疾病,其特点为有意识的强迫和反强迫并存,一些毫无意义、甚至违背自己意愿的想法或冲动反反复复侵入患者的日常生活。

    15 引用 • 161 回帖 • 1 关注
  • 书籍

    宋真宗赵恒曾经说过:“书中自有黄金屋,书中自有颜如玉。”

    84 引用 • 414 回帖
  • AngularJS

    AngularJS 诞生于 2009 年,由 Misko Hevery 等人创建,后为 Google 所收购。是一款优秀的前端 JS 框架,已经被用于 Google 的多款产品当中。AngularJS 有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、语义化标签、依赖注入等。2.0 版本后已经改名为 Angular。

    12 引用 • 50 回帖 • 518 关注
  • 人工智能

    人工智能(Artificial Intelligence)是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门技术科学。

    119 引用 • 323 回帖
  • InfluxDB

    InfluxDB 是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及实时分析。

    2 引用 • 112 关注
  • 支付宝

    支付宝是全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验,及转账收款/水电煤缴费/信用卡还款/AA 收款等生活服务应用。

    29 引用 • 347 回帖 • 2 关注
  • 脑图

    脑图又叫思维导图,是表达发散性思维的有效图形思维工具 ,它简单却又很有效,是一种实用性的思维工具。

    32 引用 • 100 回帖 • 1 关注
  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    346 引用 • 760 回帖
  • 叶归
    14 引用 • 62 回帖 • 25 关注
  • Solidity

    Solidity 是一种智能合约高级语言,运行在 [以太坊] 虚拟机(EVM)之上。它的语法接近于 JavaScript,是一种面向对象的语言。

    3 引用 • 18 回帖 • 450 关注
  • Hibernate

    Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。

    39 引用 • 103 回帖 • 725 关注
  • CentOS

    CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise Linux 依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定的服务器以 CentOS 替代商业版的 Red Hat Enterprise Linux 使用。两者的不同在于 CentOS 并不包含封闭源代码软件。

    240 引用 • 224 回帖
  • JetBrains

    JetBrains 是一家捷克的软件开发公司,该公司位于捷克的布拉格,并在俄国的圣彼得堡及美国麻州波士顿都设有办公室,该公司最为人所熟知的产品是 Java 编程语言开发撰写时所用的集成开发环境:IntelliJ IDEA

    18 引用 • 54 回帖 • 2 关注
  • 招聘

    哪里都缺人,哪里都不缺人。

    188 引用 • 1057 回帖 • 1 关注
  • FFmpeg

    FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。

    23 引用 • 32 回帖 • 5 关注
  • 深度学习

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

    43 引用 • 44 回帖
  • 职场

    找到自己的位置,萌新烦恼少。

    127 引用 • 1708 回帖
  • QQ

    1999 年 2 月腾讯正式推出“腾讯 QQ”,在线用户由 1999 年的 2 人(马化腾和张志东)到现在已经发展到上亿用户了,在线人数超过一亿,是目前使用最广泛的聊天软件之一。

    45 引用 • 557 回帖
  • React

    React 是 Facebook 开源的一个用于构建 UI 的 JavaScript 库。

    192 引用 • 291 回帖 • 369 关注
  • 新人

    让我们欢迎这对新人。哦,不好意思说错了,让我们欢迎这位新人!
    新手上路,请谨慎驾驶!

    52 引用 • 228 回帖
  • Vue.js

    Vue.js(读音 /vju ː/,类似于 view)是一个构建数据驱动的 Web 界面库。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

    268 引用 • 666 回帖 • 3 关注