2016-04-11 8 views
-4

Aşağıdaki yöntem için JUnit testini nasıl yazabilirim?JUnit Java Testi

private static final String CHAR_LIST = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; 

    private int getRandNum() { 
     Random getRand = new Random(); 
     int randomNum = getRand.nextInt(CHAR_LIST.length()); 
     if (randomNum == 0) { 
       return randomNum; 
     } else { 
       return randomNum - 1; 
     } 
    } 
+0

bu konuda ne test etmek istiyorsun? –

+1

'randomNum - 1 == -1',' randomNum == 0' ile aynıdır. –

+0

Yüzlerce kez koşturun, hiç bir zaman 0 almadığınızı kontrol edin – Stultuske

cevap

0

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.. 
+0

MyClass, alay, ne zaman ve doğrulayın? – lol

+0

MyClass sınıfınız için bir hata mesajı alıyorum. mock/ne zaman/teyit Mockito yöntemleri, Mockito (veya başka bir mock çerçeve) birim testleri yapmak için gerçekten yararlıdır. – Tobb