Erweitern Sie Davids Antwort, der ich voll und ganz zustimme, dass Sie einen Wrapper für Random erstellen sollten. Ich habe ziemlich genau die gleiche Antwort darüber in einer ähnlichen Frage geschrieben, also hier eine "Cliff's Notes-Version" davon.
Was Sie tun sollten, ist zuerst den Wrapper als Schnittstelle (oder abstrakte Klasse) zu erstellen:
public interface IRandomWrapper {
int getInt();
}
Und die konkrete Klasse dafür würde so aussehen:
public RandomWrapper implements IRandomWrapper {
private Random random;
public RandomWrapper() {
random = new Random();
}
public int getInt() {
return random.nextInt(10);
}
}
Angenommen, Ihre Klasse ist die folgende:
class MyClass {
public void doSomething() {
int i=new Random().nextInt(10)
switch(i)
{
//11 case statements
}
}
}
Um den IRandomWrapper korrekt zu verwenden, müssen Sie Ihre Klasse so ändern, dass sie als Mitglied akzeptiert wird (über einen Konstruktor oder einen 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
}
}
}
Sie können jetzt das Verhalten Ihrer Klasse mit dem Wrapper testen, indem Sie den Wrapper verspotten. Sie können dies mit einem spöttischen Framework tun, aber dies ist auch einfach selbst zu tun:
public class MockedRandomWrapper implements IRandomWrapper {
private int theInt;
public MockedRandomWrapper(int theInt) {
this.theInt = theInt;
}
public int getInt() {
return theInt;
}
}
Da Ihre Klasse etwas erwartet, das aussieht wie eine IRandomWrapper
, können Sie jetzt die verspottete verwenden, um das Verhalten in Ihrem Test zu erzwingen. Hier einige Beispiele für JUnit-Tests:
@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
}
Hoffe das hilft.