IllegalStateException - 没有可用的模拟上次调用

时间:2014-05-12 15:36:43

标签: java junit easymock illegalstateexception

我尝试使用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);
}

1 个答案:

答案 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]范围内的数字呢?