我相信你必须熟悉这个习惯用法,这是一种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类?我发现这种情况非常严重,以至于你无法轻易做到这一点。
赞赏我们的想法。
此致
答案 0 :(得分:5)
我认为匿名类应该是如此简单和简单,以至于测试包含/使用它们的结构应该足够好。
如果你有一些如此复杂,重要,重要的东西,你觉得需要测试它,使它成为一个完整的课程。
答案 1 :(得分:1)
如果您不想让匿名类型成为可以测试的实际类型,请考虑将其execute()函数中的代码移动到您可以测试的另一个函数中。然后匿名类型变成一个简陋的对象(http://xunitpatterns.com/Humble%20Object.html)。
编辑但你应该继续找到一种方法来测试匿名函数中的代码。
在像C#这样的类型安全语言中,这可以通过让匿名代码调用虚拟成员函数来完成。该测试通过覆盖虚函数调用来专门化该类,检查它是否被调用。
在像Javascript这样的非类型安全语言中,被调用的成员函数已经是虚拟的。因此,您可以使用记录版本覆盖被调用的成员函数,而不是创建派生类型。
答案 2 :(得分:0)
不要使用匿名内部类(如果有的话)。除了难以测试之外,如果没有复制和粘贴,它们几乎不可能重复使用。
大多数情况下,使它们成为完整的类可以提供更大的灵活性并改善您的OO设计(添加更多类几乎总能改善您的设计)。
顺便提一下,正如您所提到的,闭包也存在同样的问题 - 难以重用。