Spring StateMachine状态机引擎在项目中的应用(七)-集成测试

测试代码

弄了个全集的测试代码,如下:

存在逾期、部分还款
    /**
     *
     * 从创建、放款、逾期到部分还款
     *
     * @return
     * @throws OspException
     */
    @Test
    public void testFromOverdueToRepaid() throws OspException {
        // a. 创建已签约接口
        String bizOrderId = createSignOrder();

        // b.构造放款请求
        BizOrderStatusRequest loanReq = genStatusRequestFromCondition(bizOrderId,
                BizOrderOperationTypeEnum.LOAN,
                SIGNED,
                null  // 可填LOANING,也可不填,会有默认值。但是不能填别的状态,状态机会禁止随意改变状态
        );
        OrderBaseResponse response = bizOrderStatusService.loan(loanReq);
        System.out.println(response);
        Assert.assertNull(response.getMsg());
        Assert.assertEquals(BizOrderErrorCode.SUCCESS.name(), response.getResultCode());

        // c. 放款成功请求
        BizOrderStatusRequest loanSuccReq = genStatusRequestFromCondition(bizOrderId,
                BizOrderOperationTypeEnum.LOAN,  // 放款失败,直接关单
                LOANING,
                LOANED  // 可不传,会默认
        );
        OrderBaseResponse loanSuccResp = bizOrderStatusService.loanSucc(loanSuccReq);
        System.out.println(loanSuccResp);
        Assert.assertNull(loanSuccResp.getMsg());
        Assert.assertEquals(BizOrderErrorCode.SUCCESS.name(), loanSuccResp.getResultCode());

        // d.生成账单请求
        BizOrderStatusRequest genBillReq = genStatusRequestFromCondition(bizOrderId,
                BizOrderOperationTypeEnum.GEN_BILL,
                LOANED,
                null  // 可以不传,也可以传BILL_BILL
        );

        OrderBaseResponse genBillResp = bizOrderStatusService.genBill(genBillReq);
        System.out.println(genBillResp);
        Assert.assertNull(genBillResp.getMsg());
        Assert.assertEquals(BizOrderErrorCode.SUCCESS.name(), genBillResp.getResultCode());

        // e. 到逾期
        BizOrderStatusRequest overdueReq = genStatusRequestFromCondition(bizOrderId,
                BizOrderOperationTypeEnum.OVERDUE,
                BILL_GEN,
                OVERDUE
        );
        OrderBaseResponse overdueResp = bizOrderStatusService.overdue(overdueReq);
        System.out.println(overdueResp);
        Assert.assertNull(overdueResp.getMsg());
        Assert.assertEquals(BizOrderErrorCode.SUCCESS.name(), overdueResp.getResultCode());

        // f. 从逾期到部分还款
        BizOrderStatusRequest partRepayReq = genStatusRequestFromCondition(bizOrderId,
                BizOrderOperationTypeEnum.REPAY,
                OVERDUE,
                REPAID  // 置为还款中,必传
        );
        partRepayReq.getBizOrderStatusModel().setEffectAmount(2.5);

        OrderBaseResponse partRepayResp = bizOrderStatusService.repay(partRepayReq);
        System.out.println(partRepayResp);
        Assert.assertNull(partRepayResp.getMsg());
        Assert.assertEquals(BizOrderErrorCode.SUCCESS.name(), partRepayResp.getResultCode());

        // g. 校验状态是否为部分还款
        SingleOrderResponse queryResponse = bizOrderQueryService.findOrderByBizOrderId(bizOrderId);
        Assert.assertNull(queryResponse.getMsg());
        Assert.assertEquals(BizOrderErrorCode.SUCCESS.name(), queryResponse.getResultCode());
        Assert.assertEquals(BizOrderStatusEnum.REPAID.getStatus(), queryResponse.getOrderModel().getOrderStatus());

    }
从放款到全部还款,不存在逾期及部分还款
    /**
     * 从还款到最终订单结束
     *
     * 测试顺序 --- 2
     *
     * @return
     * @throws OspException
     */
    @Test
    public void testFromRepaidToSuccess() throws OspException {
        // a. 创建已签约接口
        String bizOrderId = createSignOrder();

        // b.构造放款请求
        BizOrderStatusRequest loanReq = genStatusRequestFromCondition(bizOrderId,
                BizOrderOperationTypeEnum.LOAN,
                SIGNED,
                null  // 可填LOANING,也可不填,会有默认值。但是不能填别的状态,状态机会禁止随意改变状态
        );
        OrderBaseResponse response = bizOrderStatusService.loan(loanReq);
        System.out.println(response);
        Assert.assertNull(response.getMsg());
        Assert.assertEquals(BizOrderErrorCode.SUCCESS.name(), response.getResultCode());

        // c. 放款成功请求
        BizOrderStatusRequest loanSuccReq = genStatusRequestFromCondition(bizOrderId,
                BizOrderOperationTypeEnum.LOAN,  // 放款失败,直接关单
                LOANING,
                LOANED  // 可不传,会默认
        );
        OrderBaseResponse loanSuccResp = bizOrderStatusService.loanSucc(loanSuccReq);
        System.out.println(loanSuccResp);
        Assert.assertNull(loanSuccResp.getMsg());
        Assert.assertEquals(BizOrderErrorCode.SUCCESS.name(), loanSuccResp.getResultCode());

        // d.生成账单请求
        BizOrderStatusRequest genBillReq = genStatusRequestFromCondition(bizOrderId,
                BizOrderOperationTypeEnum.GEN_BILL,
                LOANED,
                null  // 可以不传,也可以传BILL_BILL
        );

        OrderBaseResponse genBillResp = bizOrderStatusService.genBill(genBillReq);
        System.out.println(genBillResp);
        Assert.assertNull(genBillResp.getMsg());
        Assert.assertEquals(BizOrderErrorCode.SUCCESS.name(), genBillResp.getResultCode());

        // e. 全部还款
        BizOrderStatusRequest repayReq = genStatusRequestFromCondition(bizOrderId,
                BizOrderOperationTypeEnum.REPAY,
                BILL_GEN,
                REPAID  // 置为全部还款,必传
        );
        repayReq.getBizOrderStatusModel().setEffectAmount(6.5);

        OrderBaseResponse repayResp = bizOrderStatusService.repay(repayReq);
        System.out.println(repayResp);
        Assert.assertNull(repayResp.getMsg());
        Assert.assertEquals(BizOrderErrorCode.SUCCESS.name(), repayResp.getResultCode());

        // f. 从还款到销账
        BizOrderStatusRequest successReq = genStatusRequestFromCondition(bizOrderId,
                BizOrderOperationTypeEnum.SUCCESS,
                REPAID,
                SUCCESS  // 置为全部还款,必传
        );

        OrderBaseResponse succResp = bizOrderStatusService.succ(successReq);
        System.out.println(succResp);
        Assert.assertNull(succResp.getMsg());
        Assert.assertEquals(BizOrderErrorCode.SUCCESS.name(), succResp.getResultCode());

        // g. 校验状态是否为全部还款
        SingleOrderResponse queryResponse = bizOrderQueryService.findOrderByBizOrderId(bizOrderId);
        Assert.assertNull(queryResponse.getMsg());
        Assert.assertEquals(BizOrderErrorCode.SUCCESS.name(), queryResponse.getResultCode());
        Assert.assertEquals(BizOrderStatusEnum.SUCCESS.getStatus(), queryResponse.getOrderModel().getOrderStatus());

    }
构造订单变化请求,私有方法
    /**
     * 从创建订单开始构造状态变化请求
     *
     * @param initStatus
     * @param operationTypeEnum
     * @param curStatus
     * @param targetStatus
     * @return
     * @throws OspException
     */
    private BizOrderStatusRequest genStatusRequestFromCreate(BizOrderStatusEnum initStatus,
                                                             BizOrderOperationTypeEnum operationTypeEnum,
                                                             BizOrderStatusEnum curStatus,
                                                             BizOrderStatusEnum targetStatus
    ) throws OspException {

        BizOrderStatusRequest statusRequest = new BizOrderStatusRequest();

        statusRequest.setBizCode(createOrder(initStatus));
        statusRequest.setOperationType(operationTypeEnum.getOperationType());
        statusRequest.setSourceId(IDGenerater.getUniId());

        BizOrderStatusModel statusModel = new BizOrderStatusModel();
        statusModel.setBizType(BizOrderBizTypeEnum.EMPLOAN.getOrderBizType());
        statusModel.setBizOrderId(statusRequest.getBizCode());
        statusModel.setCurrentOrderStatus(curStatus.getStatus());
        if (null != targetStatus) {
            statusModel.setTargetOrderStatus(targetStatus.getStatus());
        }
        statusRequest.setBizOrderStatusModel(statusModel);
        statusRequest.setCallSystem("vip-2");

        return statusRequest;
    }

从制定状态 构造 状态变化请求
    /**
     * 从指定条件构造状态变化请求
     *
     * @param bizOrderId
     * @param operationTypeEnum
     * @param currentStatus
     * @param targetStatus
     * @return
     */
    private BizOrderStatusRequest genStatusRequestFromCondition(String bizOrderId,
                                                                BizOrderOperationTypeEnum operationTypeEnum,
                                                                BizOrderStatusEnum currentStatus,
                                                                BizOrderStatusEnum targetStatus) {

        BizOrderStatusRequest statusRequest = new BizOrderStatusRequest();

        statusRequest.setBizCode(bizOrderId);
        statusRequest.setOperationType(operationTypeEnum.getOperationType());
        statusRequest.setSourceId(IDGenerater.getUniId());

        BizOrderStatusModel statusModel = new BizOrderStatusModel();
        statusModel.setBizType(BizOrderBizTypeEnum.EMPLOAN.getOrderBizType());
        statusModel.setBizOrderId(statusRequest.getBizCode());
        statusModel.setCurrentOrderStatus(currentStatus.getStatus());
        if (null != targetStatus) {
            statusModel.setTargetOrderStatus(targetStatus.getStatus());
        }
        statusRequest.setBizOrderStatusModel(statusModel);
        statusRequest.setCallSystem("wyd-new");

        return statusRequest;
    }

    /**
     * 创建订单,并入库
     *
     * @param targetStatus
     * @return
     * @throws OspException
     */
    private String createOrder(BizOrderStatusEnum targetStatus) throws OspException {
        init();
        BizOrderCreateRequest createRequest = new BizOrderCreateRequest();

        createRequest.setBizCode("001"); // 创建时指定传输内容001
        createRequest.setSourceId(IDGenerater.getUniId());
        createRequest.setOperationType(BizOrderOperationTypeEnum.CREATE_ORDER.getOperationType());
        createRequest.setCallSystem("vip-pay");

        BizOrderCreateModel createModel = new BizOrderCreateModel();
        createRequest.setBizOrderCreateModel(createModel);

        createModel.setUserId(131415161788l);
        createModel.setMerchantId(8l);
        createModel.setContractId(3l);
        createModel.setProdId(20l);
//        createModel.setProdCode(); 可为空
        createModel.setBizType(BizOrderBizTypeEnum.EMPLOAN.getOrderBizType()); // 无忧贷
        createModel.setOrderStatus(targetStatus.getStatus());
        createModel.setOrderSrc("h6");

        BizOrderExtendsCreateModel extendsModel = new BizOrderExtendsCreateModel();
        createRequest.setExtendsCreateModel(extendsModel);

        extendsModel.setUserRealname("张小强");

        if (log.isDebugEnabled()) {
            log.debug("debug log level");
        }

        // 创建订单
        BizOrderCreateResponse response = bizOrderCreateService.create(createRequest);
        System.out.println(response);
        Assert.assertNull(response.getMsg());
        Assert.assertEquals(BizOrderErrorCode.SUCCESS.name(), response.getResultCode());

        SingleOrderResponse queryResponse = bizOrderQueryService.findOrderByBizOrderId(response.getBizOrderId());
        Assert.assertNull(queryResponse.getMsg());
        Assert.assertEquals(BizOrderErrorCode.SUCCESS.name(), queryResponse.getResultCode());
        Assert.assertEquals(targetStatus.getStatus(), queryResponse.getOrderModel().getOrderStatus());

        return response.getBizOrderId();
    }

    /**
     * 构造已签约完成的订单,并返回订单ID
     *
     * @return
     * @throws OspException
     */
    private String createSignOrder() throws OspException {
        // a. 创建状态为WAIT_BORROW的订单
        BizOrderCreateRequest createRequest = wrapCreateRequest(BizOrderStatusEnum.WAIT_BORROW);

        BizOrderCreateResponse response = bizOrderCreateService.create(createRequest);
        System.out.println(response);
        Assert.assertNull(response.getMsg());
        Assert.assertEquals(BizOrderErrorCode.SUCCESS.name(), response.getResultCode());

        SingleOrderResponse queryResponse1 = bizOrderQueryService.findOrderByBizOrderId(response.getBizOrderId());
        BizOrderModel bizOrderModel = queryResponse1.getOrderModel();


        // a.1 构造审核成功对应请求
        BizOrderStatusRequest inDealRiskAuditSuccReq = genStatusRequestFromCondition(response.getBizOrderId(),
                BizOrderOperationTypeEnum.AUDIT,
                WAIT_BORROW,
                WAIT_SIGN);

        OrderBaseResponse auditResp = bizOrderStatusService.audit(inDealRiskAuditSuccReq);
        System.out.println(auditResp);
        Assert.assertNull(auditResp.getMsg());
        Assert.assertEquals(BizOrderErrorCode.SUCCESS.name(), auditResp.getResultCode());

        // b. 签约,处理签约过程中的请求数据,这里最好把所有数据都传入,数据一定要做校验的

        // b.1 最外层数据
        BizOrderCreateRequest bizOrderCreateRequest = new BizOrderCreateRequest();
        bizOrderCreateRequest.setBizCode(response.getBizOrderId());
        bizOrderCreateRequest.setOperationType(BizOrderOperationTypeEnum.SIGN.getOperationType());
        bizOrderCreateRequest.setSourceId(IDGenerater.getUniId());
        bizOrderCreateRequest.setCallSystem("wyd");

        // b.2 订单主数据
        BizOrderCreateModel createModel = new BizOrderCreateModel();
        createModel.setBizOrderId(bizOrderCreateRequest.getBizCode());
//        createModel.setOrderStatus(BizOrderStatusEnum.SIGNED.getStatus());
        createModel.setBizType(BizOrderBizTypeEnum.EMPLOAN.getOrderBizType());
        createModel.setUserId(bizOrderModel.getUserId());
        createModel.setContractId(bizOrderModel.getContractId());
        createModel.setMerchantId(bizOrderModel.getMerchantId());
        createModel.setProdId(bizOrderModel.getProdId());
        createModel.setProdCode(bizOrderModel.getProdCode());

        // b.3 资金相关  --- 注意,资金信息需要保持平衡
        createModel.setAmount(14.5);
        createModel.setRealAmount(10.89);
        createModel.setRepayType("等额本金");
        createModel.setScene("个人消费");
        createModel.setRate(0.0035);
        createModel.setRateType(RateTypeEnum.DAY.getRateType());
        createModel.setOverdueRate(0.007);
        createModel.setOverdueRateType(RateTypeEnum.DAY.getRateType());
        createModel.setLoanStartDate(Date.from(Instant.now()));
        createModel.setLoanEndDate(Date.from(Instant.now().plus(30, ChronoUnit.DAYS)));

        bizOrderCreateRequest.setBizOrderCreateModel(createModel);

        // b.4 上传贷款合同  -- 可省略,本次在测试,构造全量数据
        BizOrderLoanContractUploadModel model1 = new BizOrderLoanContractUploadModel();
        model1.setContractNo("ab0011005");
        model1.setContractContent("https://www.vipshop.com/files/contentab0011aa00.pdf");

        BizOrderLoanContractUploadModel model2 = new BizOrderLoanContractUploadModel();
        model2.setContractNo("abc000111");
        model2.setContractContent("http://sina.com/fileserver/contentabc000111.txt");

        bizOrderCreateRequest.setContractModels(Lists.newArrayList(
                model1, model2
        ));

        // b.5 活动信息  -- 可不传,本次测试,构造全量数据
        BizOrderActivityCreateModel activity1 = new BizOrderActivityCreateModel();
        activity1.setActivityCode("ac001001");
        activity1.setActivityName("优惠券");
        activity1.setActivityType("COUPON");
        activity1.setActivitySrc("唯品会419大促金融分会馆");
        activity1.setCouponAmount(1.22);
        activity1.setEffectTime(Date.from(Instant.now().plus(-1, ChronoUnit.DAYS)));
        activity1.setSerialNo("c293573272572385782937592759237");

        BizOrderActivityCreateModel activity2 = new BizOrderActivityCreateModel();
        activity2.setActivitySrc("唯品会419大促金融冲击波");
        activity2.setActivityType("DISCOUNT");
        activity2.setActivityName("活动优惠立减 1%利息");
        activity2.setActivityCode("DS00120101");
        activity2.setDiscountRate(0.01);
        activity2.setDiscountRateSrc("唯品会");
        activity2.setDiscountRateType(RateTypeEnum.DAY.getRateType());
        activity2.setSerialNo("DS0010101010438503038930894");

        bizOrderCreateRequest.setActivityModels(Lists.newArrayList(
                activity1, activity2
        ));

        // b.6 放款渠道
        BizOrderChannelCreateModel channelCreateModel1 = new BizOrderChannelCreateModel();
        channelCreateModel1.setChannelNo("CASH0001");
        channelCreateModel1.setChannelAmount(5);
        channelCreateModel1.setChannelName("自有资金");

        BizOrderChannelCreateModel channelCreateModel2 = new BizOrderChannelCreateModel();
        channelCreateModel2.setChannelNo("CASH001-BANK");
        channelCreateModel2.setChannelAmount(5.89);
        channelCreateModel2.setChannelName("1号银行渠道");

        bizOrderCreateRequest.setChannelModels(Lists.newArrayList(channelCreateModel1, channelCreateModel2));

        // c.6 扩展信息更新
        BizOrderExtendsCreateModel extendsCreateModel = new BizOrderExtendsCreateModel();
        extendsCreateModel.setRepayDate(Date.from(Instant.now().plus(-15, ChronoUnit.DAYS)));
        extendsCreateModel.setGoodsName("update-ada");
        bizOrderCreateRequest.setExtendsCreateModel(extendsCreateModel);


        // c. 签约
        OrderBaseResponse signResp = bizOrderCreateService.createFromSign(bizOrderCreateRequest);
        System.out.println(signResp);
        Assert.assertNull(signResp.getMsg());
        Assert.assertEquals(BizOrderErrorCode.SUCCESS.name(), signResp.getResultCode());

        // d. 校验
        SingleOrderResponse queryResponse = bizOrderQueryService.findOrderByBizOrderId(response.getBizOrderId());
        Assert.assertNull(queryResponse.getMsg());
        Assert.assertEquals(BizOrderErrorCode.SUCCESS.name(), queryResponse.getResultCode());
        Assert.assertEquals(BizOrderStatusEnum.SIGNED.getStatus(), queryResponse.getOrderModel().getOrderStatus());

        return response.getBizOrderId();
    }

    private BizOrderCreateRequest wrapCreateRequest(BizOrderStatusEnum targetStatus) {
        init();
        BizOrderCreateRequest createRequest = new BizOrderCreateRequest();

        createRequest.setBizCode("001"); // 创建时指定传输内容001
        createRequest.setSourceId(IDGenerater.getUniId());
        createRequest.setOperationType(BizOrderOperationTypeEnum.CREATE_ORDER.getOperationType());
        createRequest.setCallSystem("vip-pay-2");

        BizOrderCreateModel createModel = new BizOrderCreateModel();
        createRequest.setBizOrderCreateModel(createModel);

        createModel.setUserId(131415161788l);
        createModel.setMerchantId(8l);
        createModel.setContractId(3l);
        createModel.setProdId(20l);
//        createModel.setProdCode(); 可为空
        createModel.setBizType(BizOrderBizTypeEnum.EMPLOAN.getOrderBizType()); // 无忧贷
        createModel.setOrderStatus(targetStatus.getStatus());
        createModel.setOrderSrc("vipfins-ios");

        BizOrderExtendsCreateModel extendsModel = new BizOrderExtendsCreateModel();
        createRequest.setExtendsCreateModel(extendsModel);

        extendsModel.setUserRealname("张小强");
        // 10天之后还款
        extendsModel.setRepayDate(Date.from(Instant.now().plus(10, ChronoUnit.DAYS)));


        if (log.isDebugEnabled()) {
            log.debug("debug log level");
        }

        return createRequest;
    }

这里使用junit,模拟整个订单的生命周期,发送对应的事件event驱动整个过程。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 227,428评论 6 531
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 98,024评论 3 413
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 175,285评论 0 373
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 62,548评论 1 307
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 71,328评论 6 404
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 54,878评论 1 321
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 42,971评论 3 439
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 42,098评论 0 286
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 48,616评论 1 331
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 40,554评论 3 354
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 42,725评论 1 369
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 38,243评论 5 355
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 43,971评论 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 34,361评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 35,613评论 1 280
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 51,339评论 3 390
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 47,695评论 2 370

推荐阅读更多精彩内容