商城购买会员打折满减优惠券商品

news2024/11/15 9:07:08

文章目录

  • 前言
  • 一、代码结构
  • 二、UML图
  • 三、代码实现
    • 3.1.domain
    • 3.2.enums
    • 3.3.strategy
    • 3.4.service
    • 3.5.config
  • 四、单元测试
  • 五、模式应用
  • 六、问题及优化思路
    • 6.1.问题
    • 6.2.优化
  • 总结


前言

使用策略模式、工厂方法模式、单例模式实现一些购买策略,需求:商城商品根据用户是否是会员,如果是会员则根据会员等级进行商品原价折扣,再根据商品是否参加满减,如果参加满减则对同一类型满减的商品进行合计去掉满减金额,然后再根据用户是否使用优惠券,在进行则扣。


一、代码结构

在这里插入图片描述


二、UML图

在这里插入图片描述


三、代码实现

3.1.domain

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.math.BigDecimal;

/**
 * 优惠券
 *
 * @author 28382
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Coupon {
    /**
     * 优惠金额
     */
    private BigDecimal amount;

}
import com.mxf.code.product_coupon.enums.ProductTypeEnum;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author mxf
 * @version 1.0
 * @description: 满减
 * @date 2023/6/9
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class FullReduction {

    private String productType;

    private List<FullReductionItem> fullReductionItemList;

    public static final Map<String, List<FullReductionItem>> FULL_REDUCTION_BY_PRODUCT_TYPE_MAP;

    // 默认数据
    static {
        FULL_REDUCTION_BY_PRODUCT_TYPE_MAP = new HashMap<>();
        List<FullReductionItem> fullReductionItemList = new ArrayList<>();
        fullReductionItemList.add(new FullReductionItem(new BigDecimal("300"), new BigDecimal("30")));
        fullReductionItemList.add(new FullReductionItem(new BigDecimal("200"), new BigDecimal("10")));
        FULL_REDUCTION_BY_PRODUCT_TYPE_MAP.put(ProductTypeEnum.PRODUCT_TYPE1.getType(), fullReductionItemList);
        List<FullReductionItem> fullReductionItemList2 = new ArrayList<>();
        fullReductionItemList2.add(new FullReductionItem(new BigDecimal("100"), new BigDecimal("5")));
        FULL_REDUCTION_BY_PRODUCT_TYPE_MAP.put(ProductTypeEnum.PRODUCT_TYPE2.getType(), fullReductionItemList2);
    }
}
import lombok.AllArgsConstructor;
import lombok.Data;

import java.math.BigDecimal;

/**
 * @author mxf
 * @version 1.0
 * @description: 满减信息
 * @date 2023/6/9
 */
@Data
@AllArgsConstructor
public class FullReductionItem {
    /**
     * 满减门槛
     */
    private BigDecimal threshold;
    /**
     * 满减金额
     */
    private BigDecimal reduction;
}
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 会员
 *
 * @author 28382
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Member {
    /**
     * 会员等级
     */
    private int level;
}
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.math.BigDecimal;

/**
 * 商品
 *
 * @author 28382
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Product {
    /**
     * 商品名称
     */
    private String name;
    /**
     * 价格
     */
    private BigDecimal price;
    /**
     * 会员商品,可参与会员打折
     */
    private boolean isMemberProduct;
    /**
     * 类型
     */
    private String type;
}

3.2.enums

import lombok.Getter;

import java.math.BigDecimal;
import java.util.stream.Stream;

/**
 * @author mxf
 * @version 1.0
 * @description: 会员等级枚举
 * @date 2023/6/9
 */
@Getter
public enum MemberDiscountEnum {
    /**
     * 非会员
     */
    NON_MEMBER(Integer.MIN_VALUE, new BigDecimal("1")),
    /**
     * 一级会员
     */
    DISCOUNT_RATE_LEVEL1(1,new BigDecimal("0.9")),
    /**
     * 二级会员
     */
    DISCOUNT_RATE_LEVEL2(2,new BigDecimal("0.85")),
    /**
     * 三级会员
     */
    DISCOUNT_RATE_LEVEL3(3,new BigDecimal("0.8"));
    private final Integer level;
    private final BigDecimal discount;

    MemberDiscountEnum(Integer level, BigDecimal discount) {
        this.level = level;
        this.discount = discount;
    }

    public static BigDecimal getDiscountByLevel(Integer level) {
        return Stream.of(MemberDiscountEnum.values())
                .filter(e -> e.getLevel().equals(level))
                .map(MemberDiscountEnum::getDiscount)
                .findFirst().orElse(new BigDecimal("1"));
    }
}
import lombok.Getter;
import lombok.NoArgsConstructor;

/**
 * @author mxf
 * @version 1.0
 * @description: 商品类型枚举
 * @date 2023/6/9
 */
@Getter
@NoArgsConstructor
public enum ProductTypeEnum {
    /**
     * 商品类型1
     */
    PRODUCT_TYPE1("type1", "类型1"),
    /**
     * 商品类型2
     */
    PRODUCT_TYPE2("type2", "类型2"),
    /**
     * 商品类型3
     */
    PRODUCT_TYPE3("type3", "类型3");
    private String type;
    private String desc;

    ProductTypeEnum(String type, String desc) {
        this.type = type;
        this.desc = desc;
    }
}

3.3.strategy

import com.mxf.code.product_coupon.domain.Member;
import com.mxf.code.product_coupon.domain.Product;

import java.math.BigDecimal;

/**
 * 折扣策略
 */
public interface DiscountStrategy {

    BigDecimal calculateDiscountPrice(Product product, Member member);
}
import com.mxf.code.product_coupon.domain.Product;

import java.math.BigDecimal;
import java.util.List;

/**
 * 满减策略接口
 *
 * @author 28382
 */
public interface FullReductionStrategy {

    BigDecimal calculateFullReductionPrice(List<Product> productList);
}
import com.mxf.code.product_coupon.domain.Member;
import com.mxf.code.product_coupon.domain.Product;
import com.mxf.code.product_coupon.enums.MemberDiscountEnum;
import com.mxf.code.product_coupon.strategy.DiscountStrategy;

import java.math.BigDecimal;

/**
 * 会员折扣策略
 *
 * @author 28382
 */
public class MemberDiscountStrategy implements DiscountStrategy {

    @Override
    public BigDecimal calculateDiscountPrice(Product product, Member member) {
        return product.getPrice().multiply(MemberDiscountEnum.getDiscountByLevel(member.getLevel()));
    }
}
import com.mxf.code.product_coupon.domain.FullReduction;
import com.mxf.code.product_coupon.domain.FullReductionItem;
import com.mxf.code.product_coupon.domain.Product;
import com.mxf.code.product_coupon.strategy.FullReductionStrategy;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 类型满减策略
 *
 * @author 28382
 */
public class FullReductionForTypeStrategy implements FullReductionStrategy {

    @Override
    public BigDecimal calculateFullReductionPrice(List<Product> productList) {
        BigDecimal total = BigDecimal.ZERO;

        Map<String, List<Product>> productMap = productList.stream()
                .collect(Collectors.groupingBy(Product::getType));

        for (Map.Entry<String, List<Product>> entry : productMap.entrySet()) {
            String productType = entry.getKey();
            List<Product> products = entry.getValue();

            BigDecimal totalProductPrice = products.stream()
                    .map(Product::getPrice)
                    .reduce(BigDecimal.ZERO, BigDecimal::add);
                    
            if (FullReduction.FULL_REDUCTION_BY_PRODUCT_TYPE_MAP.containsKey(productType)) {
                List<FullReductionItem> fullReductionItems = FullReduction.FULL_REDUCTION_BY_PRODUCT_TYPE_MAP.get(productType);
                BigDecimal maxReduction = BigDecimal.ZERO;
                for (FullReductionItem item : fullReductionItems) {
                    if (totalProductPrice.compareTo(item.getThreshold()) >= 0 && item.getReduction().compareTo(maxReduction) > 0) {
                        maxReduction = item.getReduction();
                    }
                }
                total = total.add(totalProductPrice.subtract(maxReduction));
            } else {
                total = total.add(totalProductPrice);
            }
        }
        return total;
    }
}
import com.mxf.code.product_coupon.domain.Coupon;
import com.mxf.code.product_coupon.domain.Member;
import com.mxf.code.product_coupon.domain.Product;

import java.math.BigDecimal;
import java.util.List;

/**
 * AbstractPriceCalculator 抽象类
 * 提供了基本的价格计算方法,其中包括判断是否是会员、是否有优惠券、计算总价等方法
 */
public abstract class AbstractPriceCalculator {
    protected DiscountStrategy discountStrategy;
    protected FullReductionStrategy fullReductionStrategy;

    public AbstractPriceCalculator(DiscountStrategy discountStrategy, FullReductionStrategy fullReductionStrategy) {
        this.discountStrategy = discountStrategy;
        this.fullReductionStrategy = fullReductionStrategy;
    }

    protected BigDecimal getDiscountPrice(Product product, Member member) {
        return discountStrategy.calculateDiscountPrice(product, member);
    }

    protected BigDecimal getFullReductionPrice(List<Product> productList) {
        return fullReductionStrategy.calculateFullReductionPrice(productList);
    }

    protected boolean isMember(Member member) {
        return member != null && member.getLevel() > 0;
    }

    protected boolean hasCoupon(Coupon coupon) {
        return coupon != null && coupon.getAmount().compareTo(BigDecimal.ZERO) > 0;
    }

    public BigDecimal calculateTotalPrice(List<Product> productList, Member member, Coupon coupon) {
        BigDecimal totalPrice;
        for (Product product : productList) {
            if (isMember(member) && product.isMemberProduct()) {
                // 会员价
                BigDecimal discountPrice = getDiscountPrice(product, member);
                product.setPrice(discountPrice);
            }
        }
        // 满减
        totalPrice = getFullReductionPrice(productList);
        // 优惠券
        if (hasCoupon(coupon)) {
            totalPrice = totalPrice.subtract(coupon.getAmount());
        }
        return totalPrice;
    }
}

/**
 * 价格计算器
 * 在需要使用价格计算器的地方注入 PriceCalculator 实例,并调用其方法计算价格
 * @author 28382
 */
public class PriceCalculator extends AbstractPriceCalculator {

    public PriceCalculator(DiscountStrategy discountStrategy, FullReductionStrategy fullReductionStrategy) {
        super(discountStrategy, fullReductionStrategy);
    }
}

3.4.service

在需要使用价格计算器的地方注入 PriceCalculator 实例,并调用其方法计算价格。

import com.mxf.code.product_coupon.domain.Coupon;
import com.mxf.code.product_coupon.domain.Member;
import com.mxf.code.product_coupon.domain.Product;

import java.math.BigDecimal;
import java.util.List;

/**
 * @author mxf
 * @version 1.0
 * @description: 商品业务类
 * @date 2023/6/12
 */
public interface ProductService {
    BigDecimal calculatePrice(List<Product> productList, Member member, Coupon coupon);
}
import com.mxf.code.product_coupon.domain.Coupon;
import com.mxf.code.product_coupon.domain.Member;
import com.mxf.code.product_coupon.domain.Product;
import com.mxf.code.product_coupon.service.ProductService;
import com.mxf.code.product_coupon.strategy.PriceCalculator;

import java.math.BigDecimal;
import java.util.List;

/**
 * 商品业务实现类
 *
 * @author 28382
 */
public class ProductServiceImpl implements ProductService {
    private final PriceCalculator priceCalculator;

    public ProductServiceImpl(PriceCalculator priceCalculator) {
        this.priceCalculator = priceCalculator;
    }

    @Override
    public BigDecimal calculatePrice(List<Product> productList, Member member, Coupon coupon) {
        return priceCalculator.calculateTotalPrice(productList, member, coupon);
    }
}

3.5.config

import com.mxf.code.product_coupon.domain.Coupon;
import com.mxf.code.product_coupon.domain.Member;
import com.mxf.code.product_coupon.domain.Product;
import com.mxf.code.product_coupon.service.ProductService;
import com.mxf.code.product_coupon.strategy.PriceCalculator;

import java.math.BigDecimal;
import java.util.List;

/**
 * 商品业务实现类
 *
 * @author 28382
 */
public class ProductServiceImpl implements ProductService {
    private final PriceCalculator priceCalculator;

    public ProductServiceImpl(PriceCalculator priceCalculator) {
        this.priceCalculator = priceCalculator;
    }

    @Override
    public BigDecimal calculatePrice(List<Product> productList, Member member, Coupon coupon) {
        return priceCalculator.calculateTotalPrice(productList, member, coupon);
    }
}

四、单元测试

import com.mxf.code.product_coupon.config.AppConfig;
import com.mxf.code.product_coupon.domain.Coupon;
import com.mxf.code.product_coupon.domain.Member;
import com.mxf.code.product_coupon.domain.Product;
import com.mxf.code.product_coupon.service.ProductService;
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.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import static org.junit.Assert.assertEquals;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {AppConfig.class})
public class PriceCalculatorTests {
    @Autowired
    private ProductService productService;

    @Test
    public void testCalculateTotalPrice() {
        List<Product> productList = new ArrayList<>();
        productList.add(new Product("product1", new BigDecimal("100"), false, "type1"));
        productList.add(new Product("product2", new BigDecimal("150"), true, "type1"));
        productList.add(new Product("product3", new BigDecimal("50"), true, "type1"));

        Member member = new Member();
        member.setLevel(2);

        Coupon coupon = new Coupon();
        coupon.setAmount(new BigDecimal("20"));

        BigDecimal totalPrice = productService.calculatePrice(productList, member, coupon);
        assertEquals(new BigDecimal("240.00"), totalPrice);
    }
}

五、模式应用

  1. 策略模式
    DiscountStrategy 和 FullReductionStrategy 接口以及它们的实现类 MemberDiscountStrategy 和 FullReductionForTypeStrategy 是策略模式的经典应用。通过定义不同的策略接口和具体实现类,可以方便地对不同的业务逻辑进行封装,并且可以在运行时动态地替换不同的策略,从而达到更灵活、更易于扩展的效果。

    在 PriceCalculator 类的构造方法中,我们将不同的策略实例注入进来,并保存在该对象中。在计算价格的时候,我们可以根据需要选择不同的策略进行计算。

  2. 工厂方法模式
    在 AppConfig 类中,我们使用了工厂方法模式来创建不同的 Bean 对象,并将它们注册到 IoC 容器中。例如 memberDiscountStrategy() 方法和 fullReductionForTypeStrategy() 方法分别创建了 MemberDiscountStrategy 和 FullReductionForTypeStrategy 的实例,并将它们注入到 PriceCalculator 的构造方法中。

  3. 单例模式
    在 Spring Boot 中,默认情况下所有的 Bean 都是单例的。因此,我们也可以将 PriceCalculator 设计为单例模式,保证该对象在整个应用程序中只创建一次。在 AppConfig 中,我们使用 @Bean 注解来创建 PriceCalculator 实例,并指定其作用域为 singleton。


六、问题及优化思路

6.1.问题

  • 在 PriceCalculator 中,我们硬编码了两种策略的实现类。如果需要新增一种策略或者更换现有的策略,就需要修改该类的代码。这违反了开闭原则,不利于代码的维护和扩展。
  • 在策略模式中,每个具体策略实现类都需要单独创建一个对象。这可能会导致内存的浪费,尤其是在系统中存在大量不同的策略实现类时。

6.2.优化

  • 使用工厂方法模式或者依赖注入来动态地创建策略实例,从而提高代码的扩展性。例如,可以将不同的策略实现类注册到 IoC 容器中,然后在 PriceCalculator 中根据需要动态获取对应的实例。
  • 使用享元模式来共享策略对象。在该模式中,相同的对象只需要创建一次,并在需要的时候进行共享和重用。可以将策略对象保存在一个 HashMap 中,并根据需要从中获取。这样可以节约内存,同时也能提高对象的复用性和性能。

总结

这次购买商品融入了一些常用的设计模式,可扩展的同时也存在一些不足,对此也提出了一些缺点和优化建议,具体可根据策略模式那篇博文进行适当改进

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/638069.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

服装库存管理系统 Mybatis+Layui+MVC+JSP【完整功能介绍+实现详情+源码】

完整源码资料 地址直达&#xff1a;http://t.csdn.cn/RWsGw 前言 这是大二时候写的第一个Java项目&#xff0c;框架基本上都没有用到、而且用到的技术很老很老。只简单使用了一个Mybatis简化数据库的操作。前端框架用的还是Layui&#xff0c;贼难用。闲的无聊&#xff0c;对这…

缺少成本票怎么解决?首选自然人代开,方便又快捷!

《税筹顾问》专注于园区招商&#xff0c;您的贴身节税小能手&#xff0c;合理合规节税&#xff01; 成本票缺失导致的严重结果就是&#xff0c;缺少成本入账&#xff0c;导致利润虚高&#xff0c;企业所得税变高了&#xff0c;那么现有的解决方式很多&#xff0c;只是一些方法过…

图形学实验(完整文件见上传)

CRect rect; this->GetClientRect(rect); pDC->Ellipse(rect); // DDALineView.cpp : implementation of the CDDALineView class // #include “stdafx.h” #include “DDALine.h” #include “DDALineDoc.h” #include “DDALineView.h” #ifdef _DEBUG #define new…

Qt扫盲-QEvent 理论总结

QEvent 理论总结 一、概述二、事件类型1. Qt 已定义类型2. 开放用户定义类型 三、注册事件 一、概述 Qt的主事件循环(QCoreApplication::exec())从事件队列中获取原生窗口系统事件&#xff0c;将它们转换为QEvents&#xff0c;并将转换后的事件发送给QObjects。 一般来说&…

Multimodal fusion via cortical network inspired losses(第一次优质论文分享)

Multimodal fusion via cortical network inspired losses 论文介绍1. 论文研究的任务是什么&#xff1f;2. 论文关注/拟解决的问题是什么&#xff1f;3. 论文提出什么方法如何解决这个问题&#xff1f;4. 如何设计实验 来证明 所提方法确实解决了 拟解决的问题&#xff1f; 论…

Ada Tutorial(2)SPARK Examiner + SPARK Prover

文章目录 代码 Task1.adb代码 task3.adbtask4.adb 在Ada和SPARK中&#xff0c;SPARK_Mode是一个编译指示&#xff0c;它表示随后的代码将使用SPARK语言规则进行编译和分析。 在with SPARK_Mode > On的影响下&#xff0c;编译器会在编译过程中应用SPARK语言规则&#xff0c;它…

基于“声音”的量子计算机 | Science速递

光子盒研究院 现在&#xff0c;一个基于声音的量子计算机关键构件已被首次被证明是有效的。 构建量子计算机的一种流行方式是将信息编码到光粒子的量子状态中&#xff0c;然后将它们送过镜子和透镜等“迷宫”般的设备阵列来操纵这些信息。量子力学定律指出&#xff0c;量子粒子…

关于B/S结构系统的会话session机制

用户打开浏览器&#xff0c;进行一系列操作&#xff0c;然后最终将浏览器关闭&#xff0c;这整个过程叫做一次会话&#xff0c;会话对象叫session 用户在浏览器上点击了一次超链接或按钮等&#xff0c;称为一次请求&#xff0c;java对象是request session机制属于B/S结构的一部…

项目 引入 uView

只分享干货&#xff01; 第一点&#xff1a; npm install uview-ui//或yarn add uview-ui 第二点 import Vue from vue; import uView from uview-ui;Vue.use(uView);//或// main.js import uView from /node_modules/uview-ui Vue.use(uView) 第三点 import /node_module…

RK3568开发板 buildroot配置文件

在上一期技术分享中我们学会了如何在buildroot里选中我们自己想要的软件&#xff0c;如vsftpd、openssh等&#xff0c;那么有些客户可能会有疑问&#xff0c;安装完软件后需要配置相应的环境&#xff0c;应该怎么样默认的配置在系统中呢&#xff1f;其实这里的话已经为大家考虑…

python kafka 指定消费者名字

#!/usr/bin/env python # codingutf-8 """ kafka的消费者不是线程安全的&#xff0c;不能多线程启用 kafka不像其他的MQ&#xff0c;消费完数据&#xff0c;直接丢掉&#xff0c;而是会默认存储7天&#xff0c;存储7天后自动清除&#xff0c;故而可以从…

AI虚拟数字人在医学领域的四大应用场景

AI虚拟数字人技术是一种基于计算机图形学和人工智能技术的新型应用&#xff0c;可以模拟人类的外貌、语言、行为等特征&#xff0c;实现与人类的交互。在医疗领域中&#xff0c;AI虚拟数字人技术也有着广泛的应用前景。以下是几个可能的应用场景&#xff1a; 1.医学教育 AI虚拟…

java poi生成excel折线图、柱状图、饼图、动态列表

实现效果 测试类 public class ChartTest {// 开始行public static int chartRowStart 3;// 结束行public static int chartRowEnd 20;public static ChartPosition chartPosition;public static void main(String[] args) throws IOException {// 填充数据XSSFWorkbook work…

30个Python代码,10分钟get常用技巧!

关注“Python专栏”&#xff0c;搜索暗号【面试大全】立即领取面试题简历模板。 学 Python 怎样才最快&#xff0c;当然是实战各种小项目&#xff0c;只有自己去想与写&#xff0c;才记得住规则。本文是 30 个极简任务&#xff0c;初学者可以尝试着自己实现&#xff1b;本文同样…

DVWA-XSS (Stored)

跨站点脚本 &#xff08;XSS&#xff09;”攻击是一种注入问题&#xff0c;其中恶意脚本被注入到原本良性和受信任的网站上。 当攻击者使用 Web 应用程序发送恶意代码&#xff08;通常以浏览器端脚本的形式&#xff09;时&#xff0c;就会发生 XSS 攻击&#xff0c; 给其他最终…

腾讯云数据库mysql报错sql_mode=only_full_group_by的解决方法

原因:mysql5.6和5.7兼容问题 解决方法: sql_mode“ONLY_FULL_GROUP_BY” 把这个去掉

如何优雅的自动修改node_modules 中的依赖包内容?

使用 patch-package 自动修改 项目中node_modules中内容 背景简介&#xff1a;我们在使用第三方依赖包时如果遇到了 bug&#xff0c;通常解决的方式都是绕过这个问题&#xff0c;使用其他方式解决&#xff0c;较为麻烦。或者给作者提个 issue 或者 PR&#xff0c;然后等待作者的…

真有无限流量上网设备吗?必须是那种真无限流量、不限速的

提到无限流量&#xff0c;七八年前确实有这种说法&#xff0c;而且是官方说法&#xff0c;三大运营商卡套餐都有无限流量这一说。比如当时电信推出过一款99元/月流量无限用的手机卡套餐&#xff0c;移动运营商出过一款89元/月的类似产品&#xff0c;都是打着无限流量的标语&…

Android 13-SystemUI 屏幕左上角或者左上交显示绿色亮点,去掉该亮点

packages/SystemUI/src/com/android/systemui/privacy/PrivacyConfig.kt private const val DEFAULT_MIC_CAMERA false 改成false就好了

Randoop随机测试自动生成测试用例

什么是Randoop&#xff1a; Randoop是一个为JAVA单元测试生成测试用例的框架&#xff08;生成器&#xff09;&#xff0c;它基于Junit格式为编译后JAVA字节码&#xff08;classes&#xff09;自动生成测试用例. Randoop通过反馈式的随机测试来生成测试用例&#xff0c;由于测…