您不能直接对lambda进行单元测试,因为它没有名称。除非您有引用,否则无法调用它。
通常的替代方法是将lambda重构为命名方法,并使用产品代码中的方法引用,然后通过测试代码中的名称来调用该方法。如您所述,这种情况不能通过这种方式重构,因为它捕获
foo,并且方法引用唯一可以捕获的是接收器。
但是yshavit的答案涉及一个重要点,即是否有必要对私有方法进行单元测试。Lambda当然可以视为私有方法。
这里还有一个更大的要点。单元测试的原则之一是,您不需要对任何简单易破的单元进行测试。这与lambda的理想情况非常吻合,该表达式非常简单,显然是正确的。(至少,这就是我认为的理想选择。)请考虑以下示例:
baz -> baz.setFoo(foo)
毫无疑问,此lambda表达式在传递给
Baz引用时会调用其
setFoo方法并将其
foo作为参数传递吗?也许它是如此简单以至于不需要进行单元测试。
另一方面,这仅是示例,也许您想要测试的实际lambda相当复杂。我看过使用大型嵌套多行lambda的代码。这样的lambda确实很难调试和测试。如果lambda中的代码足够复杂以至于需要进行测试,那么也许应该将该代码从lambda中重构出来,以便可以使用常规技术对其进行测试。



