如何测试匿名类?

时间:2009-07-17 22:26:38

标签: unit-testing idioms coupling

我相信你必须熟悉这个习惯用法,这是一种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
  }
});

我使用了这个习语/模式,但是recently I tried to test it,这让我头疼......

如何隔离测试ResourceManager和Client类?我发现这种情况非常严重,以至于你无法轻易做到这一点。

赞赏我们的想法。

此致

3 个答案:

答案 0 :(得分:5)

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

如果你有一些如此复杂,重要,重要的东西,你觉得需要测试它,使它成为一个完整的课程。

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:0)

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

大多数情况下,使它们成为完整的类可以提供更大的灵活性并改善您的OO设计(添加更多类几乎总能改善您的设计)。

顺便提一下,正如您所提到的,闭包也存在同样的问题 - 难以重用。

相关问题