SpringBoot 集成 JUNIT 测试下单基本流程|学习笔记

简介: 快速学习 SpringBoot 集成 JUNIT 测试下单基本流程

开发者学堂课程【RocketMQ 知识精讲与项目实战(第二阶段)SpringBoot 集成 JUNIT 测试下单基本流程】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/703/detail/12423


SpringBoot 集成 JUNIT 测试下单基本流程


1、@override

publicResultconfirmorder(Tradeorderorder){

//1.校验订单是否合法

checkorder(order);

//2.生成预订单,在数据库中保存一个对用户不可见的订单数据

LongorderId=savePreorder(order);

order.setorderId(orderId);

try{

//3.扣减库存,调用商品的微服务进行库存的扣减

reduceGoodsNum(order);

//4.扣减优惠券,调用优惠卷的微服务

changeCoponstatus(order);

//5.使用余额,用户在数据库中的余额减订单中要使用的余额

reduceMoneyPaid(order);

//6.确认订单,将生成预订单的状态设置为可见即可

updateorderstatus(order);

log.info("订单:["+orderId+"]确认成功");

returnnewResult(ShopCode.SHOP_SUCCESS.getsuccess(),

shopCode.SHOP_SUCCESS.getMessage());

}catch(Exceptione){

//确认订单失败,发送消息

returnnewResult(ShopCode.SHOP_FAIL.getsuccess(,

ShopCode.SHOP_FAIL.getMessage());

}

}

2、测试,首先要把每一个微服务启动起来,包含优惠卷微服务,商品微服务,用户微服务。

image.png

(1)点击 shop-coupon-service,

创建入口令 CouponApplication。

image.png

packagecom.itheima.shop;

Import

com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;

importorg.springframework.boot.SpringApplication;

import

org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication

@EnableDubboConfiguration

publicclassCouponApplication{

publicstaticvoidmain(String[]args){

SpringApplication.run(CouponApplication.class,args)

}

}

(2)点击 shop-goods-service,创建入口令 GoodsApplication。

image.png

packagecom.itheima.shop;

import

com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;

importorg.springframework.boot.SpringApplication;

importorg.springfr

amework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication

@EnableDubboConfiguration

publicclassGoodsApplication{

publicstaticvoidmain(String[]args){

SpringApplication.run(GoodsApplication.class,args);

}

}

(3)点击 shop-order-service,创建入口令 OrderApplication。

image.png

packagecom.itheima.shop;

import

com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;

importorg.springframework.boot.SpringApplication;

import

org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication

@EnableDubboConfiguration

publicclassOrderApplication{

publicstaticvoidmain(String[]args){

SpringApplication.run(OrderApplication.class,args);

}

}

(4)点击  shop-user-service,创建入口令 UserApplication。

image.png

packagecom.itheima.shop;

import

com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;

importorg.springframework.boot.SpringApplication;

import

org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication

@EnableDubboConfiguration

publicclassUserApplication{

publicstaticvoidmain(String[]args){

SpringApplication.run(UserApplication.class,args);

}

}

3、打开虚拟机 zookeeper,启动微服务,环境准备好,使用编写的入口令启动,但是在启动前要注意couponservicelmpl 中注入了 tradecouponmapper,mapper 接口,mapper 注入进来,上面要有@mapper 注解。报错不是编译的问题,是工具在当前要找到接口的事项类,但是运行时才会进行注入。

启动,可以看到 double 的 logo。

image.png

查看是否有错误的信息,在192.168.25.140:8080/dubbo-admin/图

形化界面,可以看服务是否注册到注册中心

image.png

可以看到启动了一个微服务。

image.png

4、按照同样的方式启动 shop-goods-service,先不要启动 shop-order-service,它要依赖 shop-user-service,所以先启动 UserApplication,刷新可以看到。

image.png

5、启动 shop-order-service,其中先检查 service 中的服务是否存在,不要忘记添加 idworker,使用 spring 注解的方式 bean 的实例化,returnidworker 的对象,指定数据中心的id以及机器的 id。

@Bean

publicIDWorkergetBean(){

returnnewIDWorker(datacenterld:1,machineld:1);

}

做好准备工作,启动orderapplication,查看是否启动成功,服务都被启动成功。

image.png

6、优化,如果有外部层,名字不好起,所以入口令名字中间都加 Service,CouponServiceApplication,好区分是外部层还是服务层,先启动 UserSericeApplication,再启动 OrderServiceApplication,GoodsServiceApplication

,刷新,再启动 OrderServiceApplication。

image.png

7、在 shop-order-service 编写单元测试,使用单元测试方法进行测试,四个微服务都被启动,接下来编写单元测试类,在 shop-order-service-src-test-java 中创建包 com.itheima.test。

image.png

创建测试类 OrderServiceTest。

image.png

packagecom.itheima.test;

importcom.itheima.shop.OrderServiceApplication;

importorg.junit.runner.RunWith;

import

org.springframework.boot.test.context.SpringBootTest;

import

org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)

//如果之前没用springboot进行测试,需要指定当前核心配置文件,但是现在 springboot 集成 JUNIT,所以只需要指定入口类的 class

即可

@SpringBootTest(classes=OrderServiceApplication.class)

publicclassOrderServiceTest{

//注入

@Autowired

privateIOrderServiceorderService;

//注解

@Test

publicvoidconfirmOrder(){

LongcoupouId=345988230098857984L;

LonggoodsId=345959443973935104L;

LonguserId=345963634385633280L;

image.png

TradeOrderorder=newTradeOrder();

//商品id

order.setGoodsId(goodsid);

//用户id

order.setUserId(userid);

//优惠卷

order.setCouponId(coupouid);

//收货地址

order.setAddress("北京");

//买一套

order.setGoodsNumber(1);

//订单确认是商品被加入到购物车,将购物车数据进行保存,让前台

提交商品的单价,方便后台的比对

order.setGoodsPrice(newBigDecimal(val:1000));

//前台提交运费,运费是0

order.setShippingFee(BigDecimal.ZERO);

//商品总的价格加快递的费用

order.setOrderAmount(newBigDecimal(val:1000));

image.png

//使用余额

order.setMoneyPaid(newBigDecimal(val:100));

//调用方法,确认订单

orderService.confirmOrder(order);

}

}

8、查看测试结果,测试出现异常,20884端口被占用,spring.dubbo.protocol.port=20884以测试的方法去运行时会自动启动 OrderServiceApplication.class 微服务,微服务在之前已经启动过,单元测试还要加载入口令,启动微服务,所以就会报错,把 OrderServiceApplication 关掉,通过单元测试的方式进行启动,用户的余额是1000,优惠卷是20,商品数量是1000,测试。出现异常,日期有问题,改成2020-10-10,保存。

image.png

用户表中的日期是非法的日期,所以导致出现问题,查看其他数据是否受到影响,重新测试,执行成功,没有出现问题,检查数据库中订单是否生成,可以看到有订单生成,订单总金额是1000,减优惠卷20,减余额100,支付金额880。优惠卷已经使用。

image.png

记录减库存日志。

image.png

用户余额900。

image.png

操作记录。

image.png

相关文章
|
3月前
|
SQL 数据可视化 关系型数据库
MCP与PolarDB集成技术分析:降低SQL门槛与简化数据可视化流程的机制解析
阿里云PolarDB与MCP协议融合,打造“自然语言即分析”的新范式。通过云原生数据库与标准化AI接口协同,实现零代码、分钟级从数据到可视化洞察,打破技术壁垒,提升分析效率99%,推动企业数据能力普惠化。
317 3
|
6月前
|
人工智能 Java 测试技术
Spring Boot 集成 JUnit 单元测试
本文介绍了在Spring Boot中使用JUnit 5进行单元测试的常用方法与技巧,包括添加依赖、编写测试类、使用@SpringBootTest参数、自动装配测试模块(如JSON、MVC、WebFlux、JDBC等),以及@MockBean和@SpyBean的应用。内容实用,适合Java开发者参考学习。
723 0
|
2月前
|
Java 测试技术 数据库连接
【SpringBoot(四)】还不懂文件上传?JUnit使用?本文带你了解SpringBoot的文件上传、异常处理、组件注入等知识!并且带你领悟JUnit单元测试的使用!
Spring专栏第四章,本文带你上手 SpringBoot 的文件上传、异常处理、组件注入等功能 并且为你演示Junit5的基础上手体验
888 2
|
4月前
|
人工智能 自然语言处理 安全
Python构建MCP服务器:从工具封装到AI集成的全流程实践
MCP协议为AI提供标准化工具调用接口,助力模型高效操作现实世界。
884 1
|
5月前
|
Cloud Native 中间件 调度
云原生信息提取系统:容器化流程与CI/CD集成实践
本文介绍如何通过工程化手段解决数据提取任务中的稳定性与部署难题。结合 Scrapy、Docker、代理中间件与 CI/CD 工具,构建可自动运行、持续迭代的云原生信息提取系统,实现结构化数据采集与标准化交付。
186 1
云原生信息提取系统:容器化流程与CI/CD集成实践
|
5月前
|
Java 测试技术 Spring
简单学Spring Boot | 博客项目的测试
本内容介绍了基于Spring Boot的博客项目测试实践,重点在于通过测试驱动开发(TDD)优化服务层代码,提升代码质量和功能可靠性。案例详细展示了如何为PostService类编写测试用例、运行测试并根据反馈优化功能代码,包括两次优化过程。通过TDD流程,确保每项功能经过严格验证,增强代码可维护性与系统稳定性。
258 0
|
6月前
|
人工智能 Java 测试技术
SpringBoot 测试实践:单元测试与集成测试
在 Spring Boot 测试中,@MockBean 用于创建完全模拟的 Bean,替代真实对象行为;而 @SpyBean 则用于部分模拟,保留未指定方法的真实实现。两者结合 Mockito 可灵活控制依赖行为,提升测试覆盖率。合理使用 @ContextConfiguration 和避免滥用 @SpringBootTest 可优化测试上下文加载速度,提高测试效率。
366 5
|
XML Java 测试技术
Spring5入门到实战------17、Spring5新功能 --Nullable注解和函数式注册对象。整合JUnit5单元测试框架
这篇文章介绍了Spring5框架的三个新特性:支持@Nullable注解以明确方法返回、参数和属性值可以为空;引入函数式风格的GenericApplicationContext进行对象注册和管理;以及如何整合JUnit5进行单元测试,同时讨论了JUnit4与JUnit5的整合方法,并提出了关于配置文件加载的疑问。
Spring5入门到实战------17、Spring5新功能 --Nullable注解和函数式注册对象。整合JUnit5单元测试框架
|
9月前
|
Java 测试技术 Android开发
课时148:junit测试工具
课时148介绍了JUnit测试工具的使用,包括定义、配置和编写测试程序。JUnit是流行的用例测试工具,用于确保代码稳定性。
195 0
|
Java 程序员 测试技术
Java|让 JUnit4 测试类自动注入 logger 和被测 Service
本文介绍如何通过自定义 IDEA 的 JUnit4 Test Class 模板,实现生成测试类时自动注入 logger 和被测 Service。
248 5