我尝试使用EasyMock测试方法运行了特定次数,但我一直收到IllegalStateException错误而且我不明白为什么。我是EasyMock和JUnit的新手,并不熟悉如何使用它们,所以我不确定我做错了什么。
我的代码是:
FileOutputStream mockWriter;
Numbers mockByte;
@Test
public void testNumbers() throws IOException{
mockWriter = createMock(FileOutputStream.class);
mockByte = new Numbers(mockWriter);
mockByte.initByte();
expect(mockByte.generate()).times(10000);
replay(mockWriter);
}
这些是initByte和我的Numbers类生成的方法:
public void initByte() throws IOException{
File outFile = new File("NumbersOutput.txt");
FileOutputStream f = new FileOutputStream(outFile);
for(int i = 0; i < 10000; i++){
int b = generate();
f.write(b);
}
f.flush();
f.close();
}
public int generate(){
return rand.nextInt(100001);
}
答案 0 :(得分:4)
你得到的错误是因为没有人在你的模拟上调用任何东西。
与您的命名相反,mockByte
根本不会引用模拟,因此在这样的expect
调用中使用它不会对您有所帮助。如果有的话,你应该期待mockWriter
的电话。
但是,目前尚不清楚为什么你根本就使用了一个模拟流,也没有使用Numbers构造函数中的OutputStream。您的initByte()方法不使用除rand之外的对象中的任何状态。即使修复了这个问题,最简单的方法就是使用ByteArrayOutputStream ...根据OutputStream而不是FileOutputStream进行API谈话,并且测试起来会容易得多。
我怀疑你应该:
FileOutputStream
方法中删除新initByte
的构造,而不是写入Numbers
构造函数中接受的流FileOutputStream
,请将其更改为OutputStream
以使其更清晰,更易于测试ByteArrayOutputStream
- 您根本不需要嘲笑。然后,您可以获取已写入的所有字节,并根据需要检查它们。f.write(b)
做什么。它只会写一个字节,因此随机数的前24位将被忽略。那时,为什么要选择[0,10000]范围内的数字呢?