Burada% 100 Anlamlı test oluşturmak zor, ama ben size yöntem biraz ayrıştırmak gerektiğini düşünüyorum, bu yüzden Random
nesneyi alay edebilir.
İlk önce, yönteminizi basitleştirmelisiniz. Eğer doğru bir şekilde anlarsam, burada ne istediğinizi listeniz için rastgele bir indeks oluşturmaktır, ancak bunu yaptığınız gibi asla listeden son endeksi üretemezsiniz ve ilk indeksi (0) alma olasılığı iki katına çıkar. Diğer endekslerden herhangi birini almak.
//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());
}
Sonra, ya yansıma yoluyla veya casusluk yoluyla, sahte/ajanla Rastgele nesneyi değiştirebilirsiniz:
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..
bu konuda ne test etmek istiyorsun? –
'randomNum - 1 == -1',' randomNum == 0' ile aynıdır. –
Yüzlerce kez koşturun, hiç bir zaman 0 almadığınızı kontrol edin – Stultuske