Espandendo la risposta di David con la quale concordo pienamente che dovresti creare un wrapper per Random. Ho scritto praticamente la stessa risposta in precedenza in una domanda simile, quindi ecco una "versione di Cliff's notes".
Quello che dovresti fare è creare prima il wrapper come interfaccia (o classe astratta):
public interface IRandomWrapper {
int getInt();
}
E la classe concreta per questo sarebbe simile a questa:
public RandomWrapper implements IRandomWrapper {
private Random random;
public RandomWrapper() {
random = new Random();
}
public int getInt() {
return random.nextInt(10);
}
}
Supponiamo che la tua lezione sia la seguente:
class MyClass {
public void doSomething() {
int i=new Random().nextInt(10)
switch(i)
{
//11 case statements
}
}
}
Per utilizzare correttamente IRandomWrapper è necessario modificare la classe per prenderla come membro (tramite il costruttore o un setter):
public class MyClass {
private IRandomWrapper random = new RandomWrapper(); // default implementation
public setRandomWrapper(IRandomWrapper random) {
this.random = random;
}
public void doSomething() {
int i = random.getInt();
switch(i)
{
//11 case statements
}
}
}
Ora puoi testare il comportamento della tua classe con il wrapper, deridendo il wrapper. Puoi farlo con un framework beffardo, ma anche questo è facile da fare da solo:
public class MockedRandomWrapper implements IRandomWrapper {
private int theInt;
public MockedRandomWrapper(int theInt) {
this.theInt = theInt;
}
public int getInt() {
return theInt;
}
}
Dal momento che la tua classe si aspetta qualcosa che assomigli a uno IRandomWrapper
, ora puoi usare quello deriso per forzare il comportamento nel tuo test. Ecco alcuni esempi di test JUnit:
@Test
public void testFirstSwitchStatement() {
MyClass mc = new MyClass();
IRandomWrapper random = new MockedRandomWrapper(0);
mc.setRandomWrapper(random);
mc.doSomething();
// verify the behaviour for when random spits out zero
}
@Test
public void testFirstSwitchStatement() {
MyClass mc = new MyClass();
IRandomWrapper random = new MockedRandomWrapper(1);
mc.setRandomWrapper(random);
mc.doSomething();
// verify the behaviour for when random spits out one
}
Spero che sia di aiuto.