Расширяя ответ Дэвида, с которым я полностью согласен, вы должны создать оболочку для Random. Я написал примерно такой же ответ об этом ранее в аналогичном вопросе, так что вот «версия заметок Клиффа».
Что вы должны сделать, это сначала создать оболочку как интерфейс (или абстрактный класс):
public interface IRandomWrapper {
int getInt();
}
И конкретный класс для этого будет выглядеть так:
public RandomWrapper implements IRandomWrapper {
private Random random;
public RandomWrapper() {
random = new Random();
}
public int getInt() {
return random.nextInt(10);
}
}
Скажите, что ваш класс следующий:
class MyClass {
public void doSomething() {
int i=new Random().nextInt(10)
switch(i)
{
//11 case statements
}
}
}
Чтобы правильно использовать IRandomWrapper, вам нужно изменить класс так, чтобы он воспринимался как член (через конструктор или установщик):
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
}
}
}
Теперь вы можете проверить поведение вашего класса с помощью оболочки, издеваясь над оболочкой. Вы можете сделать это с помощью насмешливого фреймворка, но это легко сделать и самим:
public class MockedRandomWrapper implements IRandomWrapper {
private int theInt;
public MockedRandomWrapper(int theInt) {
this.theInt = theInt;
}
public int getInt() {
return theInt;
}
}
Так как ваш класс ожидает что-то похожее на IRandomWrapper
, теперь вы можете использовать смоделированный, чтобы вызвать поведение в вашем тесте. Вот несколько примеров тестов 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
}
Надеюсь это поможет.