最近,一个需求让我们接触到了 PODAM,可以自动使用随机数据填充Java 对象原始属性。
缘起
编写代码过程中,测试代码的广覆盖,往往能保证代码的健壮性。
完善的测试用例也能便于后期迭代开发。
测试数据增删改查过程中,最常见的莫过于初始化一个对象,然后将其插入到数据库中。
于是,下面的代码,就占用了测试代码的大部分篇幅:
Street street = new Street();
street.setNumber(12);
street.setType((byte) 1);
street.setName("Oxford street");
Address address = new Address();
address.setStreet(street);
address.setZipCode("123456");
address.setCity("London");
address.setCountry("United Kingdom");
Person person = new Person();
person.setFirstName("Foo");
person.setLastName("Bar");
person.setEmail("foo.bar@gmail.com");
person.setGender(Gender.MALE);
person.setAddress(address);
上面的代码没有任何技术含量,而且主观性比较强,开发人员会造一些期望的数据,从而导致一些意外的常见难以覆盖到。
探索
最为开发人员,这种机械又重复性的工作,当然想利用程序自动处理。
于是,我们维护了一个 RandomBean 的工具类,用于随机给对象赋值。
直到有一天,我打开这个类,发现已经上千行。。。
这么简单一个工具,需要这么多代码,我浏览了一下代码。
最初美好的幻想,被无情的需求拍打。
原来,虽然最开始这个类只是简单对整数、字符串、集合等常见类型做处理。
但是后来,各种日期类型、枚举、对象的嵌套等等场景都需要去适配。
更麻烦的是,有些数据对格式有一定要求,比如某个字符串只能有 2 个长度,某个字符串实际上是数字,之后需要转换为 BigDecimal 使用,等等。。。
救星
既然这个这么难维护,有没有现成的*可以用呢。万能的 Github 一番寻找,找到了 PODAM
使用 PODAM
加入依赖:
<dependency>
<groupId>uk.co.jemos.podam</groupId>
<artifactId>podam</artifactId>
<version>[latest.version]</version>
<!-- <scope>test</scope> -->
</dependency>
初始化一个 PodamFactory
。
@Bean
public PodamFactory PodamFactory(){
new PodamFactoryImpl();
}
项目中可以直接注入使用:
@Resource
private PodamFactory factory;
@Test
public void testSimplePojo() {
SimplePojoToTestSetters pojo = factory
.manufacturePojo(SimplePojoToTestSetters.class);
Assert.assertNotNull("The pojo cannot be null!", pojo);
...etc
}