开发者学堂课程【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、测试,首先要把每一个微服务启动起来,包含优惠卷微服务,商品微服务,用户微服务。
(1)点击 shop-coupon-service,
创建入口令 CouponApplication。
packagecom.itheima.shop;
Import
com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfigu
ration;
importorg.springframework.boot.SpringApplication;
import
org.springframework.boot.autoconfigure.SpringBootApplicatio
n;
@SpringBootApplication
@EnableDubboConfiguration
publicclassCouponApplication{
publicstaticvoidmain(String[]args){
SpringApplication.run(CouponApplication.class,args)
}
}
(2)点击 shop-goods-service,创建入口令 GoodsApplication。
packagecom.itheima.shop;
import
com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfigu
ration;
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。
packagecom.itheima.shop;
import
com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfigu
ration;
importorg.springframework.boot.SpringApplication;
import
org.springframework.boot.autoconfigure.SpringBootApplicatio
n;
@SpringBootApplication
@EnableDubboConfiguration
publicclassOrderApplication{
publicstaticvoidmain(String[]args){
SpringApplication.run(OrderApplication.class,args);
}
}
(4)点击 shop-user-service,创建入口令 UserApplication。
packagecom.itheima.shop;
import
com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfigu
ration;
importorg.springframework.boot.SpringApplication;
import
org.springframework.boot.autoconfigure.SpringBootApplicatio
n;
@SpringBootApplication
@EnableDubboConfiguration
publicclassUserApplication{
publicstaticvoidmain(String[]args){
SpringApplication.run(UserApplication.class,args);
}
}
3、打开虚拟机 zookeeper,启动微服务,环境准备好,使用编写的入口令启动,但是在启动前要注意couponservicelmpl 中注入了 tradecouponmapper,mapper 接口,mapper 注入进来,上面要有@mapper 注解。报错不是编译的问题,是工具在当前要找到接口的事项类,但是运行时才会进行注入。
启动,可以看到 double 的 logo。
查看是否有错误的信息,在192.168.25.140:8080/dubbo-admin/图
形化界面,可以看服务是否注册到注册中心
可以看到启动了一个微服务。
4、按照同样的方式启动 shop-goods-service,先不要启动 shop-order-service,它要依赖 shop-user-service,所以先启动 UserApplication,刷新可以看到。
5、启动 shop-order-service,其中先检查 service 中的服务是否存在,不要忘记添加 idworker,使用 spring 注解的方式 bean 的实例化,returnidworker 的对象,指定数据中心的id以及机器的 id。
@Bean
publicIDWorkergetBean(){
returnnewIDWorker(datacenterld:1,machineld:1);
}
做好准备工作,启动orderapplication,查看是否启动成功,服务都被启动成功。
6、优化,如果有外部层,名字不好起,所以入口令名字中间都加 Service,CouponServiceApplication,好区分是外部层还是服务层,先启动 UserSericeApplication,再启动 OrderServiceApplication,GoodsServiceApplication
,刷新,再启动 OrderServiceApplication。
7、在 shop-order-service 编写单元测试,使用单元测试方法进行测试,四个微服务都被启动,接下来编写单元测试类,在 shop-order-service-src-test-java 中创建包 com.itheima.test。
创建测试类 OrderServiceTest。
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;
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));
//使用余额
order.setMoneyPaid(newBigDecimal(val:100));
//调用方法,确认订单
orderService.confirmOrder(order);
}
}
8、查看测试结果,测试出现异常,20884端口被占用,spring.dubbo.protocol.port=20884以测试的方法去运行时会自动启动 OrderServiceApplication.class 微服务,微服务在之前已经启动过,单元测试还要加载入口令,启动微服务,所以就会报错,把 OrderServiceApplication 关掉,通过单元测试的方式进行启动,用户的余额是1000,优惠卷是20,商品数量是1000,测试。出现异常,日期有问题,改成2020-10-10,保存。
用户表中的日期是非法的日期,所以导致出现问题,查看其他数据是否受到影响,重新测试,执行成功,没有出现问题,检查数据库中订单是否生成,可以看到有订单生成,订单总金额是1000,减优惠卷20,减余额100,支付金额880。优惠卷已经使用。
记录减库存日志。
用户余额900。
操作记录。