Java的JUnit测试
如何为下面的方法编写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
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框架)对于进行单元测试非常有用。