我的Java应用程序涉及在不同的地方生成许多随机数。我非常小心地确保我的应用程序从工厂类中检索java.util.Random对象,以便我能够将其替换为在单元测试期间生成常量的模拟对象。但仍然不是一个令人满意的单元测试策略,因为只有生成的随机数序列具有一定的模式才能达到某些分支。
当涉及java.util.Random时我们应该如何进行单元测试,但是我们想要以确定的方式控制数字的返回方式?在我的Mock java.util.Random中硬编码一个特定的随机数序列仍然不是很令人满意,因为这也很难编码单元测试中的调用序列,如果我添加另一个调用来检索它很可能会改变我的应用程序中一些不相关的方法中的随机数。
答案 0 :(得分:1)
您可以像这样创建一个Random(long seed)
对象。
通过每次给它相同的种子,它应该返回相同的随机数
答案 1 :(得分:1)
您可以查看像JMockit这样的模拟框架。 JMockit是为数不多的支持模拟像Random这样的类的实际实现的人之一。使用模拟实例,您可以返回要运行单元测试的值。
答案 2 :(得分:1)
使用虚假实现预期的“随机模式”而不是模拟。
答案 3 :(得分:1)
避免建议“猜测”在程序执行期间各种随机值如何演变。虽然确实如果你在一个循环中有一个单独的函数连续多次调用Random.next()
,但是很难避免必须考虑生成的随机数的序列,你应该尽量减少那个可能的。
避免它的最简单方法是确保您可以随时将Random类实例自己传递给不同的类/方法。避免在实例图的根中传递Random实例类。然后,它可以更容易地到达并测试您想要的任何模块。