ขยายคำตอบของเดวิดซึ่งฉันเห็นด้วยอย่างยิ่งกับการที่คุณควรสร้างเสื้อคลุมสำหรับการสุ่ม ฉันเขียนคำตอบเดียวกันนี้ก่อนหน้านี้ในคำถามที่คล้ายกันดังนั้นนี่คือ "Cliff's notes version" ของมัน
สิ่งที่คุณควรทำคือการสร้าง wrapper ก่อนเป็นส่วนต่อประสาน (หรือคลาสนามธรรม):
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 อย่างถูกต้องคุณต้องแก้ไขคลาสของคุณเพื่อรับเป็นสมาชิก (ผ่าน Constructor หรือ 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
}
}
}
ตอนนี้คุณสามารถทดสอบพฤติกรรมของชั้นเรียนของคุณด้วยเสื้อคลุมโดยเยาะเย้ยเสื้อคลุม คุณสามารถทำได้ด้วยกรอบการเยาะเย้ย แต่ด้วยตัวคุณเองก็ทำได้ง่ายเช่นกัน:
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
}
หวังว่านี่จะช่วยได้