这是很难在这里建立100%的有意义的测试,但我认为你应该分解你的方法一点点,所以你可以嘲笑Random
对象。
但首先,你应该简化你的方法。如果我理解正确,那么你需要为列表生成一个随机索引,但是你这样做的方式永远不会生成列表中的最后一个索引,并且获得第一个索引(0)的可能性是两次获得其他任何指数。
//either this:
private Random random = new Random();
//or this:
Random createRandom() {
return new Random();
}
private int getRandNum() {
//either this:
return random.nextInt(CHAR_LIST.size());
//or this:
return createRandom().nextInt(CHAR_LIST.size());
}
然后,您可以用模拟/间谍更换随机对象,无论是通过反射,或通过间谍活动:
public class MyClassTest {
private MyClass myClass;
private Random mockedRandom;
@Before
public void setup() {
myClass = spy(new MyClass());
mockedRandom = mock(Random.class);
when(myClass.createRandom()).thenReturn(mockedRandom);
}
@Test
public void getRandNumShouldGenerateAValidIndexForCHAR_LIST() {
//Given CHAR_LIST.size() = 5
when(mockedRandom.nextInt(5)).thenReturn(2);
final int randomNumber = myClass.getRandNum();
assertEquals(2, randomNumber);
verify(mockedRandom).nextInt(5);
}
//a "black box" approach:
@Test
public void blackboxish() {
//Make sure CHAR_LIST.size() = 3
when(myClass.createRandom()).thenReturn(new Random());
for (int i = 0; i < 100; i++) {
final int random = myClass.getRandNum();
assertTrue(random >= 0);
assertTrue(random < 3);
}
} //there is a theoritical possibility of a false positive here, but it's small..
你想测试一下呢? –
'randomNum - 1 == -1'与'randomNum == 0'相同。 –
运行一百次,检查结果是从未得到0 – Stultuske