J'ai besoin d'écrire des tests JUnit sur le code Java qui appelle math.random () code>. Je sais que je peux mettre la graine si j'instabilise mon propre objet aléatoire pour produire des résultats reproductibles. Y a-t-il un moyen de le faire aussi pour
math.random () code>? P>
3 Réponses :
Que diriez-vous de créer une instance de aléatoire code> vous-même et d'utiliser cela à la place?
math.random () code> crée un et utilise cela, donc je ne pense pas que vous puissiez vous gâcher avec sa graine. Si vous créez un
aléatoire code> et utilisez-le directement, vous pouvez définir la graine pour que vous le créez lorsque vous le créez et / ou vous pouvez appeler
intermédiaire () code> dessus ultérieurement. . p>
la méthode si vous vraiment vraiment em> besoin de définir ceci à un math.random () code> utilise un champ statique privé:
nouveau aléatoire (constante_seed) code> (par exemple, vous devez utiliser un code de test Junit que vous n'avez pas de contrôle) Vous pouvez le faire en utilisant
Pourriez-vous éventuellement élaborer sur la partie réflexion de votre réponse s'il vous plaît?
A partir de Java 8 (ou peut-être que c'était toujours comme ça), ceci est caché légèrement plus loin - il y a une finale statique privée aléatoireNumbergenerator toholder code> en mathémique qui contient ensuite une finale statique
aléatoire code >.
Réglez-le avec une instance de aléatoire avec votre graine ou d'étendre simplement les méthodes pour renvoyer les valeurs dont vous avez besoin
Field field = Math.class.getDeclaredField("randomNumberGenerator"); field.setAccessible(true); field.set(null, new Random() { @Override public double nextDouble() { return 1; } });
La version canonique de Random devrait revenir 4!