2010-05-14 10 views
8

Potrzebuję napisać kilka testów junitowych na kodzie Java, który wywołuje Math.random(). Wiem, że mogę ustawić ziarno, jeśli tworzyłem własny losowy obiekt, aby uzyskać powtarzalne wyniki. Czy istnieje sposób, aby to zrobić również dla Math.random()?Ustaw seed na Math.random()

Odpowiedz

12

Sposób Math.random() wykorzystuje prywatne pole statyczne:

private static Random randomNumberGenerator; 

Jeśli naprawdę bardzo trzeba ustawić to do new Random(CONSTANT_SEED) (na przykład trzeba JUnit kodu testu, który nie masz kontroli nad) Cię można to zrobić, używając odbicia.

+5

mógłbyś ewentualnie opracować na części odbicia odpowiedź proszę? –

9

Co powiesz na samodzielne utworzenie wystąpienia Random i użycie go zamiast tego? Math.random() tworzy jeden i używa go, więc nie sądzę, że możesz zadzierać z jego nasieniem. Jeśli jednak utworzysz plik Random i użyjesz go bezpośrednio, możesz ustawić dla niego seed, gdy go utworzysz, i/lub możesz zadzwonić później na numer setSeed().

2

Set to przykład losowych ze swoim materiałem siewnym lub po prostu rozszerzenie metod do zwracania wartości musisz

 Field field = Math.class.getDeclaredField("randomNumberGenerator"); 
     field.setAccessible(true); 
     field.set(null, new Random() { 

      @Override 
      public double nextDouble() { 
       return 1; 
      } 

     }); 
+0

Kanoniczna wersja losowa powinna wrócić 4! –