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!