0

我的 Java 应用程序涉及在不同位置生成许多随机数。我非常小心地确保我的应用程序从工厂类中检索 java.util.Random 对象,以便我能够将其替换为在单元测试期间生成常量的模拟对象。但这仍然不是一个令人满意的单元测试策略,因为只有在生成的随机数序列具有某种模式时才能到达某些分支。

当涉及 java.util.Random 但我们想控制如何以确定的方式返回数字时,我们应该如何进行单元测试?硬编码一个特定的随机数序列以在我的 Mock java.util.Random 中返回仍然不是很令人满意,因为这也硬编码了单元测试中的调用序列,如果我添加另一个调用来检索,这很可能会改变我的应用程序中某些不相关方法中的随机数。

4

4 回答 4

1

使用假的来实现您预期的“随机模式”而不是模拟。

于 2013-11-11T16:38:14.583 回答
1

您可以查看 JMockit 之类的模拟框架。JMockit 是少数支持模拟 Random 等类的实际实现的少数几个之一。使用模拟实例,您可以返回要运行单元测试的值。

于 2013-11-10T11:27:40.337 回答
1

避免在程序执行期间“猜测”各种随机值将如何演变的建议。虽然如果您在循环中有一个函数Random.next()连续调用多次,那么确实很难避免考虑生成的随机数的序列,但您应该尽量减少它。

避免它的最简单方法是确保您可以随时将 Random 类实例自己传递给不同的类/方法。避免从实例图的根中传递 Random 实例类。然后,您可以更轻松地访问和一致地测试您想要的任何模块。

于 2013-11-11T17:31:42.447 回答
1

你可以像这样创建一个Random(long seed)对象。通过每次给它相同的种子,它应该返回相同的随机数

于 2013-11-10T10:22:15.080 回答