Java的JUnit测试

Java的JUnit测试,java,junit,Java,Junit,如何为下面的方法编写JUnit测试 private static final String CHAR_LIST = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; private int getRandNum() { Random getRand = new Random(); int randomNum = getRand.nextInt(CHAR_LIST.len

如何为下面的方法编写JUnit测试

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;
         }
    }

在这里很难创建100%有意义的测试,但是我认为您应该稍微分解一下您的方法,这样您就可以模拟
随机
对象

但首先,你应该简化你的方法。如果我理解正确,您希望在这里为您的列表生成一个随机索引,但是您这样做的方式永远不会生成列表中的最后一个索引,并且获取第一个索引(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..
公共类MyClassTest{
私人MyClass MyClass;
私有随机模拟随机;
@以前
公共作废设置(){
myClass=spy(新的myClass());
mockedRandom=mock(Random.class);
当(myClass.createRandom())。然后返回(mockedRandom);
}
@试验
public void getRandNumShouldGenerateAValidIndexForCHAR_列表(){
//给定字符列表。大小()=5
当(mockedRandom.nextInt(5)),然后返回(2);
final int randomNumber=myClass.getRandNum();
资产质量(2,随机数);
验证(模拟随机)。下一步(5);
}
//“黑箱”方法:
@试验
公共图书馆{
//确保CHAR_LIST.size()=3
当(myClass.createRandom())。然后返回(new Random());
对于(int i=0;i<100;i++){
final int random=myClass.getRandNum();
assertTrue(随机>=0);
资产真实性(随机<3);
}
}//从理论上讲,这里有假阳性的可能性,但很小。。

你想测试它吗?
randomNum-1==-1
randomNum==0
相同。运行一百次,检查你永远不会得到0。然后使用你选择的搜索引擎搜索JUnit教程。为什么会被否决?我觉得这是一个不错的问题。MyClass、mock、when和verify是什么?我会得到错误mock/when/verify是Mockito方法,Mockito(或其他一些mock框架)对于进行单元测试非常有用。