4

相信你一定对这个成语很熟悉,这算是java给闭包找的借口吧

//In the "Resource Manager" class
public void process(Command cmd){
  //Initialize
  ExpensiveResource resource = new ExpensiveResource();
  //Use
  cmd.execute(resource);
  //Release / Close
  resource.close();
}

//In the Client class...
manager.process(new Command(){

  public void execute(ExpensiveResource res){
    //Do things with the resource
  }
});

我经常使用这种成语/模式,但最近我尝试对其进行测试,这让我很头疼......

如何独立测试 ResourceManager 和 Client 类?我发现这将它们紧密结合在一起,以至于你不能轻易做到。

想法受到赞赏。

问候

4

3 回答 3

5

我认为匿名类应该如此小和简单,以至于测试包括/使用它们的结构应该足够好。

如果你有一些如此复杂、大而重要的东西,以至于你觉得有必要对其进行测试,那就让它成为一个完整的课程。

于 2009-07-17T22:34:01.007 回答
1

如果您不想使匿名类型成为您可以测试的真实类型,请考虑将其 execute() 函数中的代码移动到您可以测试的另一个函数中。然后匿名类型变成一个不起眼的对象(http://xunitpatterns.com/Humble%20Object.html)。

编辑,但您应该继续寻找一种方法来测试匿名函数中的代码。

在像 C# 这样的类型安全语言中,这可以通过让匿名代码调用虚拟成员函数来完成。该测试通过覆盖虚函数调用来专门化该类,检查它是否被调用。

在像 Javascript 这样的非类型安全语言中,被调用的成员函数已经是虚拟的。因此,您可以用记录的版本覆盖被调用的成员函数,而不是创建派生类型。

于 2009-07-17T22:42:42.407 回答
1

不要过多地使用匿名内部类(如果有的话)。除了难以测试之外,如果没有复制和粘贴,它们几乎不可能重复使用。

大多数时候,使它们成为完整的类可以提供更大的灵活性并改进您的 OO 设计(添加更多类几乎总是可以改进您的设计)。

顺便说一句,正如你提到的,闭包也有同样的问题——难以重用。

于 2009-07-17T22:32:28.623 回答