java - Easymock 模拟输入流读取操作

标签 java unit-testing easymock

我想用 easymock 测试下面的代码。我已经创建了模拟套接字和模拟输入流,但我无法模拟读取方法。谁能帮帮我

byte[] lenbuf = new byte[2];
sock.getInputStream().read(lenbuf);

我在单元测试中尝试跟随

InputStream mockInputStream = createMock(InputStream.class);
expect(mockInputStream.read(new byte[2])).andReturn(2);
replay(mockInputStream);

它给了我以下错误

  Unexpected method call InputStream.read([0, 0]):
  InputStream.read([0, 0]): expected: 1, actual: 0

谢谢

最佳答案

(另外:尝试使用 (byte[]) EasyMock.anyObject() 而不是 new byte[2] 作为要读取的参数。)

模拟输入流是一项繁重的工作,不值得去做。有很多方法可以在不使用模拟对象的情况下获取测试可以设置的假输入流。试试这个:

String fakeInput = "This is the string that your fake input stream will return";
StringReader reader = new StringReader(fakeInput);
InputStream fakeStream = new ReaderInputStream(reader);

请注意 ReaderInputStream 在 Apache Commons IO

您也可以在没有 Reader 的情况下使用 StringBufferInputStream 来完成。这不需要 Commons IO。它有不足之处,但对于测试代码来说可能已经足够好了。

事实上,与其他形式的伪造相比,一般来说,模拟是一项艰巨的工作。只有当我想证明我的被测试类的内部正在以特定方式做某事时,我才会这样做,而这并不是测试的真正目的:好的测试证明接口(interface)有效,并允许实现改变。阅读著名的 Martin Fowler 的 definition of mocks Andrew Trenk 对 some of the problems they can introduce 的看法.

关于java - Easymock 模拟输入流读取操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22060889/

相关文章:

java - EasyMock:获取 EasyMock.anyObject() 的真实参数值?

java - EasyMock "expected"调用次数大于 "times"方法中设置的值

java - EasyMock - 从新对象返回的模拟对象

java - 如何测量 OpenCL 读出时间?

java - mvn 依赖 :tree does not list dependencies of a dependency

java - 如何在java中模拟单个语句

mysql - 获取整个表内容的单元测试 SQL 查询

java - Gradle和ProGuard的MultiDex问题

java - SWT 小部件中的自定义拖动检测

java - Spring Boot MockMvc 无法使用 @PathVariable 进行测试