我需要测试一个使用random.nextDouble()的类是否有优雅的方式来提供测试这些数字以便能够预见执行的输出?
答案 0 :(得分:8)
我建议将随机数生成器嵌入到单独的组件中并将其注入到您的类中。因此,您可以在测试中注入其模拟实例。在我看来,这是最优雅的解决方案。您也可以使用反射做一些技巧并覆盖在类体内创建的随机生成器,但不建议这样做。
答案 1 :(得分:5)
是的,有:使用种子randoms。
你应该在你的类中添加一个额外的包私有构造函数,允许该类为其随机取种子。在那个构造函数中,而不是写
random = new Random();
写
random = new Random(seed);
初始化私有字段random
。通过creating a Random with a seed,您可以从种子初始化Random的内部状态。由于Random实际上不是随机的,而是伪随机数生成器,它将其下一个返回值基于当前状态,通过设置初始状态,您可以确定地设置一系列对Random调用返回的数字序列。
在您的测试代码中,使用这个特殊的包私有测试构造函数而不是默认构造函数初始化类型Foo
的新对象,并且只要您每次测试的类都传入相同的种子每次都得到相同的伪随机数序列。
答案 2 :(得分:0)
你的测试试图证明什么? nextDouble
实际返回特定值?这对我来说似乎不是一个非常有用的测试。
在这种情况下,您可以做的最好的事情就是证明如果您多次运行代码,每次都会得到不同的随机数。以1000的循环运行它,并将结果存储在某种Set
中。然后断言Set
的大小与迭代循环的次数相同。
要做得比这要好,就要求你用“随机”量化你的意思。已经写了整本书,在单元测试中尝试做的并不是一件有用的事情。