Java 8 Lambdas的单元测试代码

我已经使用Java

8几个月了,并且已经开始使用Lambda表达式,这在某些情况下非常方便。但是,我经常遇到一些问题,以对使用Lambda的代码进行单元测试。

以下面的伪代码为例:

private Bar bar;

public void method(int foo){

bar.useLambda(baz -> baz.setFoo(foo));

}

一种方法是只验证通话

verify(bar).useLambda(Matchers.<Consumer<Baz>>.any());

但是,这样做不会测试Lambda的代码。

另请注意,我无法使用方法替换Lambda并使用方法参考:

bar.useLambda(This::setFooOnBaz);

因为我不会在该方法上使用foo。 或者至少我是这样认为的。


由于我正在编码的是单元测试,所以我不想实例化bar,而我将使用模拟代替。因此,我将无法仅验证baz.setFoo电话。

回答:

您不能直接对lambda进行单元测试,因为它没有名称。除非您有引用,否则无法调用它。

通常的替代方法是将lambda重构为命名方法,并使用产品代码中的方法引用,然后通过测试代码中的名称来调用该方法。如您所述,这种情况不能通过这种方式重构,因为它捕获foo,并且方法引用唯一可以捕获的是接收器。

但是yshavit的答案涉及一个重要点,即是否有必要对私有方法进行单元测试。Lambda当然可以视为私有方法。

这里还有一个更大的要点。单元测试的原则之一是,您不需要对任何简单易破的单元进行测试。这与lambda的理想情况非常吻合,该表达式非常简单,显然是正确的。(至少,这就是我认为的理想选择。)请考虑以下示例:

    baz -> baz.setFoo(foo)

毫无疑问,此lambda表达式在传递给Baz引用时会调用其setFoo方法并将其foo作为参数传递吗?也许它是如此简单以至于不需要进行单元测试。

另一方面,这仅是示例,也许您想要测试的实际lambda相当复杂。我看过使用大型嵌套多行lambda的代码。这样的lambda确实很难调试和测试。如果lambda中的代码足够复杂以至于需要进行测试,那么也许应该将该代码从lambda中重构出来,以便可以使用常规技术对其进行测试。

以上是 Java 8 Lambdas的单元测试代码 的全部内容, 来源链接: utcz.com/qa/412445.html

回到顶部