我有一个方法,它尝试调用内存中的图像转换器,如果失败,则尝试在磁盘上执行图像转换。(内存中的图像转换器将尝试分配图像的第二个副本,因此如果原始图像非常大,我们可能没有足够的内存来容纳它。)
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,但在随后的调用中行为正常。不过,这看起来像是一次黑客攻击。
发布于 2010-10-09 05:15:30
你应该模拟你的转换器,而不是使用真正的转换器。
这样做之后,您只需让您的模拟库在调用convert()方法时抛出一个新的OOME。
例如,使用JMock时,您将执行以下操作:
allowing(mockConverter).convert(with(any(int.class)));
will(throwException(new OutOfMemoryError()));发布于 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。
发布于 2010-10-09 05:16:23
我想到我可以做BufferedImage的伪子类,它在内存转换器调用的方法第一次被调用时抛出OutOfMemoryError,但在随后的调用中行为正常。不过,这看起来像是一次黑客攻击。
你在这里走的路是对的。模拟对象正是这些类型的东西的优势所在。您并不真正关心OutOfMemory错误是否合法,您只需要确保它被抛出/捕获并执行另一条路径。把它模拟出来,你就可以运行了。
https://stackoverflow.com/questions/3894328
复制相似问题