David'in cevabını genişleterek, tamamen katılıyorum, Rastgele için bir ambalaj oluşturmalısınız. Benzer bir soruda daha önce aynı cevabı yazdım, işte bunun bir "Cliff'in not versiyonu".
Yapmanız gereken ilk olarak sarmalayıcıyı bir arayüz (veya soyut sınıf) olarak oluşturmaktır:
public interface IRandomWrapper {
int getInt();
}
Ve bunun somut sınıfı şöyle görünecektir:
public RandomWrapper implements IRandomWrapper {
private Random random;
public RandomWrapper() {
random = new Random();
}
public int getInt() {
return random.nextInt(10);
}
}
Diyelim ki sınıfınız şöyledir:
class MyClass {
public void doSomething() {
int i=new Random().nextInt(10)
switch(i)
{
//11 case statements
}
}
}
IRandomWrapper'ı doğru şekilde kullanmak için sınıfınızı üye olarak alacak şekilde değiştirmeniz gerekir (yapıcı veya ayarlayıcı aracılığıyla):
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
}
}
}
Artık, sarmalayıcıyla alay ederek sınıfınızın davranışını sarmalayıcı ile test edebilirsiniz. Bunu alaycı bir çerçeveyle yapabilirsiniz, ancak bunu kendiniz de yapmak kolaydır:
public class MockedRandomWrapper implements IRandomWrapper {
private int theInt;
public MockedRandomWrapper(int theInt) {
this.theInt = theInt;
}
public int getInt() {
return theInt;
}
}
Sınıfınız bir şeye benzeyen bir şey beklediğinden IRandomWrapper
, alay edileni testinizdeki davranışı zorlamak için kullanabilirsiniz. JUnit testlerine bazı örnekler:
@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
}
Bu yardımcı olur umarım.