2010-05-14 5 views
8

J'ai besoin d'écrire des tests junit sur le code Java qui appelle Math.random(). Je sais que je peux définir la graine si j'instancie mon propre objet aléatoire pour produire des résultats reproductibles. Existe-t-il un moyen de le faire également pour Math.random()?Définir seed sur Math.random()

Répondre

12

La méthode Math.random() utilise un champ statique privé:

private static Random randomNumberGenerator; 

Si vous vraiment vraiment besoin de mettre à un new Random(CONSTANT_SEED) (par exemple, vous devez code de test JUnit que vous avez aucun contrôle sur) vous pourrait le faire en utilisant réflexion.

+5

Pourriez-vous éventuellement élaborer de la part de la réflexion de votre réponse s'il vous plaît? –

9

Que diriez-vous de créer une instance de Random vous-même et de l'utiliser à la place? Math.random() en crée un et l'utilise, donc je ne pense pas que vous pouvez jouer avec sa graine. Cependant, si vous créez un Random et que vous l'utilisez directement, vous pouvez en définir l'origine lorsque vous le créez et/ou vous pouvez appeler le setSeed() ultérieurement.

2

Set avec instance de hasard avec votre semence ou étendre simplement les méthodes pour renvoyer des 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; 
      } 

     }); 
+0

La version canonique de random devrait retourner 4! –

Questions connexes