Rozszerzając odpowiedź Davida, z którą całkowicie się zgadzam, powinieneś stworzyć opakowanie dla Random. Wcześniej napisałem prawie taką samą odpowiedź w podobnym pytaniu, więc oto „wersja notatek Cliffa”.
Co powinieneś zrobić, to najpierw utworzyć opakowanie jako interfejs (lub klasę abstrakcyjną):
public interface IRandomWrapper {
int getInt();
}
Konkretna klasa do tego wyglądałaby tak:
public RandomWrapper implements IRandomWrapper {
private Random random;
public RandomWrapper() {
random = new Random();
}
public int getInt() {
return random.nextInt(10);
}
}
Powiedz, że twoja klasa jest następująca:
class MyClass {
public void doSomething() {
int i=new Random().nextInt(10)
switch(i)
{
//11 case statements
}
}
}
Aby poprawnie korzystać z IRandomWrapper, musisz zmodyfikować swoją klasę, aby przyjmowała ją jako element członkowski (przez konstruktor lub program ustawiający):
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
}
}
}
Możesz teraz przetestować zachowanie swojej klasy za pomocą opakowania, wyśmiewając opakowanie. Możesz to zrobić za pomocą fałszywego frameworka, ale jest to również łatwe do zrobienia samemu:
public class MockedRandomWrapper implements IRandomWrapper {
private int theInt;
public MockedRandomWrapper(int theInt) {
this.theInt = theInt;
}
public int getInt() {
return theInt;
}
}
Ponieważ twoja klasa oczekuje czegoś, co wygląda jak IRandomWrapper
wy, możesz teraz użyć kpiny, aby wymusić zachowanie w teście. Oto kilka przykładów testów 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
}
Mam nadzieję że to pomoże.