PODAM - Java 对象随机数填充器-属性随机赋值 Mock bean

痛点    

        大家项目中是否遇到过需要编写测试方法的要求, 编写代码过程中,测试代码的广覆盖,往往能保证代码的健壮性。完善的测试用例也能便于后期迭代开发。而编写测试方法对象的mock数据,如果遇到一个多属性对象,这项工作又是一个繁重且毫无意义的过程。

于是,下面的代码,就占用了测试代码的大部分篇幅:

@Test
    public void testIntegral1(){
//
//        System.out.println(JSONUtil.toJSON(integralService.queryIntegral(1)));
//        IntegralOperateRequest request = IntegralOperateRequest.builder().orderNumber("11").accountId(1).point(100).type(1).build();
//        System.out.println(JSONUtil.toJSON(integralService.reduceOrAddIntegral(request)));
//
//        System.out.println(JSONUtil.toJSON(integralService.queryIntegral(1)));
//
//        System.out.println(JSONUtil.toJSON(integralService.checkIntegralRisk(58865)));
        AppShippingAddress entity = AppShippingAddress.builder().city("深圳市").country("china").firstName("jie").lastName("luo")
                .address1("西丽街道").address2("创智云城").email("110@163.com").phone("110").province("广东省").userId(58865)
                .provinceCode("111").site("US").zip("333").build();

        OrderAddressUpdateDTO d= ClazzConverter.converterClass(entity,OrderAddressUpdateDTO.class);
        d.setOrderNumber("62218929766150144");
        System.out.println(appOrderService.updateAddressForBackend(d));



    }
 @Test
    public void testIntegral() throws Exception {
 //    QueryOrderErpListDTO dto = new QueryOrderErpListDTO();
     //   dto.setPageSize(1);
//        dto.setOrderNumber("1");
//        dto.setSite("US");
//        dto.setPageSize(2);
//        dto.setEmail("77444");
//        dto.setName("jieluo");    

    }

而且在新增场景中,我们两次测试的数据不能重复。这个时候我们又要去重新制造我们的数据。

最近,一个开源项目让我接触到了PODAM,可以自动使用随机数据填充Java 对象原始属性。

使用 PODAM

引入依赖:

<!--PODAM - Java 对象随机数填充器-属性随机赋值 Mock bean-->
            <dependency>
                <groupId>uk.co.jemos.podam</groupId>
                <artifactId>podam</artifactId>
                <version>[latest.version]</version>
            </dependency>

实际使用

package govee.app.mall.mapper.mall;

import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.RandomUtil;
import govee.app.mall.BaseTest;
import govee.app.mall.pojo.constant.BuyTypeEnum;
import govee.app.mall.pojo.constant.SiteCurrencyEnum;
import govee.app.mall.pojo.vo.address.AddressVO;
import org.junit.jupiter.api.Test;
import uk.co.jemos.podam.api.PodamFactory;
import uk.co.jemos.podam.api.PodamFactoryImpl;
import uk.co.jemos.podam.api.RandomDataProviderStrategyImpl;

import javax.annotation.PostConstruct;
import java.util.Arrays;
import java.util.function.Consumer;

/**
 * @author dongxu
 * @create 2022-12-25 下午1:42
 */
public class StudyTest extends BaseTest {

    private static final int RANDOM_STRING_LENGTH = 10;

    private static final PodamFactory PODAM_FACTORY = new PodamFactoryImpl();

    private PodamFactory factory;


    /**
     * 初始化一些类型的自定义数据
     */
    static {
        // 字符串
        PODAM_FACTORY.getStrategy().addOrReplaceTypeManufacturer(String.class,
                (dataProviderStrategy, attributeMetadata, map) -> randomString());
        // Integer
        PODAM_FACTORY.getStrategy().addOrReplaceTypeManufacturer(Integer.class, (dataProviderStrategy, attributeMetadata, map) -> {
            // 如果是 status 的字段,返回 0 或 1
            if ("status".equals(attributeMetadata.getAttributeName())) {
                return RandomUtil.randomEle(BuyTypeEnum.values()).getCode();
            }
            return RandomUtil.randomInt();
        });
        // Boolean
        PODAM_FACTORY.getStrategy().addOrReplaceTypeManufacturer(Boolean.class, (dataProviderStrategy, attributeMetadata, map) -> {
            // 如果是 deleted 的字段,返回非删除
            if ("deleted".equals(attributeMetadata.getAttributeName())) {
                return false;
            }
            return RandomUtil.randomBoolean();
        });
    }

    @PostConstruct
    public void init() {
        factory = new PodamFactoryImpl(new RandomDataProviderStrategyImpl());
    }

    public static String randomString() {
        return RandomUtil.randomString(RANDOM_STRING_LENGTH);
    }

    /**
     * 单独处理个别字段
     *
     * @param clazz     目标类
     * @param consumers 处理个别字段逻辑
     * @param <T>       目标类类型
     * @return 填充后的目标类实例
     */
    @SafeVarargs
    public static <T> T randomPojo(Class<T> clazz, Consumer<T>... consumers) {
        T pojo = PODAM_FACTORY.manufacturePojo(clazz);
        // 非空时,回调逻辑。通过它,可以实现 Pojo 的进一步处理
        if (ArrayUtil.isNotEmpty(consumers)) {
            Arrays.stream(consumers).forEach(consumer -> consumer.accept(pojo));
        }
        return pojo;
    }

    @Test
    public void testRandomPojo() {

        // 原始用法
        AddressVO addressVO = PODAM_FACTORY.manufacturePojo(AddressVO.class);
        System.out.println(addressVO.toString());

        // 自定义属性用法
        AddressVO addressVO1 = StudyTest.randomPojo(AddressVO.class, a -> {
            a.setCountry(RandomUtil.randomEle(SiteCurrencyEnum.values()).getSite());
        });
        System.out.println(addressVO1.toString());

        // @PostConstruct 用法
        AddressVO addressVO2 = factory.manufacturePojo(AddressVO.class);
        System.out.println(addressVO2.toString());
        
    }

}

Debug  1

Debug 2

 

Debug 3

 

最后挂一下github地址:PODAM 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: jmu-java-随机数-使用蒙特卡罗法计算圆周率的值 蒙特卡罗法是一种通过随机抽样来解决问题的方法。在计算圆周率的问题中,我们可以通过随机生成点的方式来模拟落在圆内的点和落在正方形内但不在圆内的点的数量,从而得到圆的面积和正方形的面积,进而计算出圆周率的值。 在使用Java编写程序时,我们可以利用Java中的随机数生成来生成随机点的坐标,然后通过判断点是否在圆内来计算圆内和圆外的点的数量。最后,根据圆的面积和正方形的面积的比例,计算出圆周率的值。 这种方法虽然简单,但是需要生成大量的随机点才能得到较为准确的结果。因此,在实际应用中,需要根据具体问题的要求来确定生成随机点的数量。 ### 回答2: 蒙特卡罗法是一种基于随机数的数值解法,其大致思想是利用概率统计原理构造随机过程,并利用随机过程解决计算问题。在计算圆周率时,可以使用蒙特卡罗法来估算其值。 具体来说,我们可以通过生成随机数的方式来模拟在一个正方形内部随机投点,将正方形视作一个包含在其中的圆的外接正方形,那么正方形内部的点有多少个落在圆的内部,就可以用这个数量来近似出圆的面积。根据圆的公式,可以通过这个近似面积来计算出圆的半径和周长,从而得出圆周率的值。 在实现上,我们可以使用Java中的Math类中的随机数函数来生成一堆随机点,然后统计其中有多少个点落在圆的内部。最终得到的比率就是圆的面积和正方形面积的比例,用这个比例乘以4就可以得到圆周率的值了。 然而,需要注意的是,这种随机投点的方法是一种概率性的计算方法,随着投点数量的增加,估算出的圆周率值会越来越接近实际值。因此,我们需要在程序中设置投点数量,以达到较为准确的计算结果。 总的来说,使用蒙特卡罗法计算圆周率的值是一种在计算中有很大应用价值的技术,特别适用于大量的模拟计算和参数估算。在Java中,通过使用Math类中的随机数函数,可以快速便捷地实现这种方法。 ### 回答3: JMU-Java是一种集成了Java语言与数学算法的库,通过使用随机数生成可以使用蒙特卡罗法计算圆周率的值。这种方法利用了概率统计的思想,在一个较大的正方形内随机生成若干个点,并统计落在圆内的点的数量,然后通过数学公式计算圆周率的值。这个方法的精确度可以通过增加正方形内的点数来提高,因此随着正方形中点数的增大,计算出的圆周率会越来越接近真实值。 使用JMU-Java库进行计算时,可以通过以下步骤实现: 首先需要导入库文件,然后设置随机数发生并选择生成点的数量和正方形的边长。然后,利用循环语句和if语句进行判断,统计出正方形内等分的子正方形和落在圆内的点的数量,然后通过公式计算出圆的面积和圆周率的值,并将结果输出。 使用蒙特卡罗法计算圆周率的优点是计算简单易懂,并且可以通过增加点的数量提高计算精确度。但是,它也存在一些缺点,如计算误差较大,需要大量计算,因此会消耗较多的时间和计算资源。另外,在使用时需要注意数据的范围和运算精度,以免影响计算结果的准确性。 总之,蒙特卡罗法计算圆周率的方法是一种简单、直观、易于实现的方法。通过使用JMU-Java库,可以方便地实现该方法,并且在学习编程和数学等方面都具有一定的帮助作用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值