如何在 Java 中 Mock Lambda 表达式?

2024 年 9 月 10 日 | 阅读 3 分钟

Lambda 表达式是运行时定义的匿名函数,这使得在 Java 中 Mock 它们变得困难。但是,通过 Mockito 或 PowerMock 等几种强大的 Mocking 框架的帮助,在 Java 中 Mock Lambda 表达式并有效地测试它们是可行的。在本文中,我们将使用最受欢迎的 Java Mocking 框架之一 Mockito 来探讨如何 Mock Lambda 表达式。

Mockito 是一个流行的 Mocking 框架,它允许您创建伪对象并在单元测试中使用它们来检查代码的行为。Mockito 最强大的功能之一是能够 Mock 函数式接口,即使是具有单个抽象方法的接口,如 Runnable、Callable 或 Comparator。Lambda 表达式也可以被 Mock,因为它们也是函数式接口。

以下是一个在 Java 中使用 Mockito Mock Lambda 表达式的示例:

LambaMockingTestExpl.java

上面的代码将不会产生任何输出,因为它只包含一个 Mocked Runnable 对象,其中包含一个 Lambda 表达式,该表达式在执行时只会打印一条消息。通过调用 Mocked Runnable 对象的 run() 方法来执行 Lambda 表达式。

但是,Lambda 表达式的执行输出(“Lambda 表达式已执行。”)不会打印到控制台,因为 Lambda 表达式不包含任何输出到控制台的代码。

在此示例中,我们使用 Mockito 来 Mock 一个 Runnable 接口。Lambda 表达式的行为是使用 doAnswer 方法定义的。在这种情况下,消息被打印到控制台,并返回 null。之后,我们使用 run 函数实际运行 Lambda 表达式,并使用 verify 方法确保它确实被执行了。

使用 Mockito,以下示例显示了如何 Mock 带有参数的 Lambda 表达式:

LambdaMockingTestExpl.java

此代码的输出将不可见,因为它仅包含测试用例而没有打印任何输出的代码。但是,当使用 JUnit 等测试框架执行此测试用例时,框架将根据测试用例中的断言来报告测试是通过还是失败。

在这种情况下,测试用例正在测试 Mock Comparator 对象是否正确执行了用于不区分大小写地比较两个字符串的 Lambda 表达式。verify 语句检查 compare 方法是否使用参数“Hello”和“world”调用,assertEquals 语句检查返回结果是否为 0,这表示两个字符串在不区分大小写比较时相等。如果两个断言都通过,测试将通过,否则将失败。

在此示例中,Mockito 被用来 Mock 一个 Comparator 接口。为了定义带有参数的 Lambda 表达式的行为,我们使用 when 方法。在这种情况下,我们正在比较两个字符串而不考虑大小写。然后使用 compare 方法和两个输入“Hello”和“world”运行 Lambda 表达式,并使用 verify 方法确认其正确执行。

总之,有效地测试 Java 中的 Lambda 表达式可能会很困难,但在 Mockito 等强大的 Mocking 框架的帮助下是可以实现的。通过使用 doAnswer 和 when 方法,您可以控制 Lambda 表达式的行为并确保它们使用正确的参数运行。阅读本文的示例后,您应该能够自信地 Mock Lambda 表达式,同时高效地评估您的代码。