首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JUnit可以模拟OutOfMemoryErrors吗?

JUnit可以模拟OutOfMemoryErrors吗?
EN

Stack Overflow用户
提问于 2010-10-09 05:11:11
回答 4查看 486关注 0票数 2

我有一个方法,它尝试调用内存中的图像转换器,如果失败,则尝试在磁盘上执行图像转换。(内存中的图像转换器将尝试分配图像的第二个副本,因此如果原始图像非常大,我们可能没有足够的内存来容纳它。)

代码语言:javascript
复制
public BufferedImage convert(BufferedImage img, int type) {
  try {
    return memory_converter.convert(type);
  }
  catch (OutOfMemoryError e) {
    // This is ok, we just don't have enough free heap for the conversion.
  }

  // Try converting on disk instead.
  return file_converter.convert(img, type);
}

我想为运行每个代码路径的JUnit编写单元测试,但是使用足够少的堆来强制执行OutOfMemoryError的JUnit是不方便的。有什么方法可以在JUnit中模拟OutOfMemoryError吗?

我突然想到,我可以创建一个假的BufferedImage子类,它在第一次调用内存中转换器调用的方法时抛出OutOfMemoryError,但在随后的调用中行为正常。不过,这看起来像是一次黑客攻击。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-10-09 05:15:30

你应该模拟你的转换器,而不是使用真正的转换器。

这样做之后,您只需让您的模拟库在调用convert()方法时抛出一个新的OOME。

例如,使用JMock时,您将执行以下操作:

代码语言:javascript
复制
allowing(mockConverter).convert(with(any(int.class)));
will(throwException(new OutOfMemoryError()));
票数 6
EN

Stack Overflow用户

发布于 2010-10-09 05:14:46

注入convert()方法抛出OutOfMemryError的存根或模拟memory_converter

我想到我可以做BufferedImage的伪子类,它在内存转换器调用的方法第一次被调用时抛出OutOfMemoryError,但在随后的调用中行为正常。不过,这看起来像是一次黑客攻击。

Mocking框架通常非常强大,应该可以让您指定此行为。例如,JMock:

http://www.jmock.org/returning.html

在连续调用时返回不同的值

有两种方法可以在不同的调用中返回不同的值。第一种是定义多个期望,并从每个期望中返回不同的值:

oneOf (anObject).doSomething();will(returnValue(10));oneOf (anObject).doSomething();will(returnValue(20));oneOf (anObject).doSomething();will(returnValue(30));

第一次调用doSomething将返回10,第二次将返回20,第三次将返回30。

票数 3
EN

Stack Overflow用户

发布于 2010-10-09 05:16:23

我想到我可以做BufferedImage的伪子类,它在内存转换器调用的方法第一次被调用时抛出OutOfMemoryError,但在随后的调用中行为正常。不过,这看起来像是一次黑客攻击。

你在这里走的路是对的。模拟对象正是这些类型的东西的优势所在。您并不真正关心OutOfMemory错误是否合法,您只需要确保它被抛出/捕获并执行另一条路径。把它模拟出来,你就可以运行了。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3894328

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档