En développant la réponse de David avec qui je suis totalement d'accord avec vous, vous devriez créer un wrapper pour Random. J'ai écrit à peu près la même réponse à ce sujet plus tôt dans une question similaire, alors voici une "version des notes de Cliff".
Ce que vous devez faire est de créer d'abord le wrapper en tant qu'interface (ou classe abstraite):
public interface IRandomWrapper {
int getInt();
}
Et la classe concrète pour cela ressemblerait à ceci:
public RandomWrapper implements IRandomWrapper {
private Random random;
public RandomWrapper() {
random = new Random();
}
public int getInt() {
return random.nextInt(10);
}
}
Disons que votre classe est la suivante:
class MyClass {
public void doSomething() {
int i=new Random().nextInt(10)
switch(i)
{
//11 case statements
}
}
}
Afin d'utiliser correctement IRandomWrapper, vous devez modifier votre classe pour la prendre comme membre (via un constructeur ou 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
}
}
}
Vous pouvez maintenant tester le comportement de votre classe avec l'encapsuleur, en vous moquant de l'encapsuleur. Vous pouvez le faire avec un cadre de simulation, mais c'est aussi facile à faire par vous-même:
public class MockedRandomWrapper implements IRandomWrapper {
private int theInt;
public MockedRandomWrapper(int theInt) {
this.theInt = theInt;
}
public int getInt() {
return theInt;
}
}
Étant donné que votre classe attend quelque chose qui ressemble à un, IRandomWrapper
vous pouvez maintenant utiliser celui simulé pour forcer le comportement dans votre test. Voici quelques exemples de tests 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
}
J'espère que cela t'aides.