当前位置: 首页 > 面试题库 >

Java 8 Lambdas的单元测试代码

笪健
2023-03-14
问题内容

我已经使用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中重构出来,以便可以使用常规技术对其进行测试。



 类似资料:
  • 我有一些代码,它使用的是class的方法,它是异步的。另外,我正在使用微软的单元测试应用程序项目来测试应用程序。 问题是测试框架并没有等待异步代码的运行结束,所以我无法检查它的结果。 如何使用Unit Test App项目测试异步代码?我没有使用异步/等待修改器。

  • 在试验并发执行时,我想知道如何实际测试它。执行流程具有副作用性质,创建未来是为了包装独立的执行/处理。 我一直在寻找一些关于如何正确单元测试的好例子,下面的场景(和是我希望测试的方法): 情景#1 情景动机 立即返回,但调用两个执行单独任务的未来(例如,保存分析并将记录存储到数据库)。这些服务调用可以被模拟,但我试图测试的是,一旦我将它们包装在s中,这两个服务都会被调用 场景#2 情景动机 从可以

  • 新的一年 之前因为上家公司的经营出了问题,年前的大裁员,过了一个漫长的春节。 之后加入了新公司,然后正好赶上一个很紧急的项目,忙成狗,因此好久没更新文章了。 不过,我又回来啦! 前言 自动化测试,我们将使用karma和nightmare,内容会包括: 单元测试 e2e测试(放下一篇文章) 其实,单元测试一般用在写公共包的时候,比如通用的js函数库,通用的UI组件库。基本不太会在做业务项目的时候还使

  • Android Studio 1.1 添加了单元测试支持,详细请看 Unit testing support。本章的其余部分描述的是 “instrumentation tests”。利用 Instrumentation 测试框架可以构建独立的测试 APK 并运行在真实设备(或模拟器)中进行测试。

  • 英文原文:http://emberjs.com/guides/testing/unit/ 单元测试用于测试代码的一个小片段,确保其功能正常。与集成测试不同,单元测试被限定在一个范围内,并且不需要Ember应用运行。 全局 vs 模块 过去如果没有作为一个全局变量加载整个Ember应用,要对应用进行测试非常困难。通过使用模块(CommonJS,AMD等)来编写应用,可以只加载被测试的部分,而不用将其

  • 我正在将ANT构建转换为Maven。我不用声纳。 在Maven中,Jacoco似乎并没有报告单元测试本身的覆盖率,而ANT报告。我也一直在尝试为我的Maven build获得这个,但是我没有找到任何东西。 似乎我应该添加一个