Expandindo a resposta de David, com a qual concordo totalmente que você deve criar um invólucro para o Random. Eu escrevi praticamente a mesma resposta sobre isso anteriormente em uma pergunta semelhante, então aqui está uma "versão das notas de Cliff".
O que você deve fazer é primeiro criar o wrapper como uma interface (ou classe abstrata):
public interface IRandomWrapper {
int getInt();
}
E a classe concreta para isso ficaria assim:
public RandomWrapper implements IRandomWrapper {
private Random random;
public RandomWrapper() {
random = new Random();
}
public int getInt() {
return random.nextInt(10);
}
}
Digamos que sua turma seja a seguinte:
class MyClass {
public void doSomething() {
int i=new Random().nextInt(10)
switch(i)
{
//11 case statements
}
}
}
Para usar o IRandomWrapper corretamente, você precisa modificar sua classe para aceitá-la como membro (por meio de construtor ou 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
}
}
}
Agora você pode testar o comportamento da sua classe com o wrapper, zombando do wrapper. Você pode fazer isso com uma estrutura de simulação, mas isso também é fácil de fazer:
public class MockedRandomWrapper implements IRandomWrapper {
private int theInt;
public MockedRandomWrapper(int theInt) {
this.theInt = theInt;
}
public int getInt() {
return theInt;
}
}
Como sua classe espera algo parecido com um, IRandomWrapper
agora você pode usar o que é ridicularizado para forçar o comportamento em seu teste. Aqui estão alguns exemplos de testes 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
}
Espero que isto ajude.