EasyMock 捕获可变参数(集合)

EasyMock capture mutable arg(collection)

我正在使用 EasyMock.capture 来捕获传递给函数的集合。但是那个集合是可变的。

因此,如果稍后函数 foo 正在修改集合,它也会反映在 EasyMock 捕获的值中。有没有一种方法可以强制 EasyMock 克隆集合而不是只保留引用?

目前无法通过 Easymock 管理此类中间捕获。

但是,您可以创建自己的捕获类型来实现这一点。

这里有一些可以帮助您入门的内容:

  public class DefensiveCopyCapture<T> extends Capture<T> {
    @Override
    public void setValue(T value) {
      // create a copy of your type here; 
      // if the type happens to be a Collection like in your case, use
      // the copy constructors to create a copy
      T copy = ...; 
      super.setValue(copy);
    }
  }

然后您可以像下面这样创建捕获并捕获任意数量的值 - 捕获的值集合将包含在整个执行过程中在不同时间捕获的所有值的快照。

Capture<Type> capturer = new DefensiveCopyCapture<Type>();

您还可以使用 getCurrentArguments 和 IAnswer 检索参数。

然而,扩展 Capture 对象也非常优雅。