在Java中递归生成随机对象

3

我应该使用哪个库/方法来在Java / Scala中为给定的类进行深度随机对象生成? 深度生成是指递归地填充整个对象图,包括原始类型和复杂类型的随机值。

目标是在测试中使用随机生成的模拟对象。

为了使测试一致和可重现,在每次运行时生成的对象集应相同。


2
你为什么计划这样做?这似乎是一个不寻常的请求,也许如果我们了解背景,就可以推荐另一种方法。 - Duncan Jones
1
@DuncanJones,我需要它自动创建各种随机生成的模拟对象来进行测试。 - Sagie Davidovich
@Russell,这不是重点,通过设置种子和/或一些数字参数来指定“随机”对象集合非常容易。甚至可以序列化并重复使用它们。 - Qnan
我猜我只是不同意那个想法。对我来说,测试的很大好处是在你编写实际代码之前,或者至少在编写实际代码时编写测试,帮助你编写更好的代码。祝你好运,希望你找到解决方案! :-) - Russell
@Russell,无论如何感谢你的反馈 :) 这个想法并不新,Jtest 是一个非常流行的框架,它基于这种范式。(http://www.parasoft.com/jsp/products/jtest.jsp?itemId=14) - Sagie Davidovich
显示剩余12条评论
3个回答

3
据我所知,有两种强大的方法可以随机生成非常大、任意类型的对象。第一种被称为“递归方法”(由Wilf和Nijenhuis引入,由Flajolet、van Cutsem和Zimmerman正式化),第二种被称为“Boltzmann采样”(由Duchon、Flajolet、Louchard和Schaeffer提出)。在这两种方法中,您需要提供一个结构定义(即“语法”),然后会返回一个符合该语法的大型随机对象。

两种方法都在程序的广泛测试中被成功地使用(类似于Haskell的QuickCheck)。不幸的是,虽然有一些不同的实现方法,但我认为Java没有一个可以直接使用的库。例如,您可能想要检查Yann Ponty's page,其中包含这些方法在生物信息学中的Java实现。如果您正在使用OCaml,则Alexis Darrasse和Benjamin Canou已经实现了 Boltzmann抽样的一个有用子集,作为代数类型(sumtypes)的完全自主库。


@SagieDavidovich:不用客气!我刚想起来Darrasse还参与了将Boltzmann采样适应于根据语法随机生成大型XML文档的工作,详见此处。无论如何,如果您有更具体的使用情况,或许我可以给您提供额外的细节(我之前也使用过这两种生成方法)。 - Jérémie

1

InPUT库可以帮助您在Java中完成此操作。您可以在XML中指定结构,称为设计空间,该空间定义了有效范围。然后在代码中,您只需调用相应的方法即可。

IDesignSpace ds = new DesignSpace("designSpace.xml");
TheType o = ds.next("TheTypeId");

现在,对象o根据您在XML中接受的有效值范围随机实例化。在这里您可以找到教程和示例。此教程解决了可重复性问题。


0
一些研究向我展示了一个名为ScalaCheck的伟大Scala框架,它受到了Jérémie上面提到的QuickCheck的启发。 虽然它是为Scala构建的,但也可以在Java中使用(尽管没有语法糖)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接