如何对Callable lambda表达式进行单元测试?

时间:2018-04-09 15:26:31

标签: lambda mockito powermockito callable

我有一段Java代码,我需要使用PowerMockito进行单元测试:

public class MyClass {

  public Response someMethod() {

    Response response = Wrapper.wrap( () -> {
      return OtherClass.doSomething();
    });

    // .... do something else ....

    return Response;
  }

}

包装器的功能实际上并不重要,但为了简单起见,这就是:

public class Wrapper {

  public Response wrap(Callable<Response> callable) {
    // ...check something...
    return callable.call();
  }

}

在单元测试中,我想模拟对OtherClass.doSomething()的调用并验证它是否被调用,但我不希望包装器实际执行lambda表达式之外的任何操作。我该如何做到这一点?

2 个答案:

答案 0 :(得分:0)

我不确定,但我相信你只想模拟静态方法。您可以按照第一个回答中的示例进行操作:PowerMockito mock single static method and return object

对于非常有效的通话,您可以使用PowerMockito中的verifyStatic方法https://automationrhapsody.com/verify-static-method-called-powermock/

答案 1 :(得分:0)

正如@ staszko032已经指出的那样,你的问题不是lambda,你的问题是静态方法调用 - 这通常是...后面的测试中的痛苦。只要<small>(或更可能是Wrapper.wrap)是静态调用,您就需要像PowerMockito这样的复杂工具。您不能指望抛出静态调用并仍然可以获得可测试的代码 - 这不是它的工作方式,抱歉。就个人而言,我倾向于说PowerMockito是一个用来解决你只有问题的工具,因为代码很糟糕。重构(如果可能)应始终优先于PowerMockito或类似工具。

所以,就个人而言,我会重构它,例如让Wrapper类不是静态的,而是将一个实例注入其中。这样,您可以在测试中注入模拟。

当然,这实际上并不能解决你的问题,因为那时你可以验证是否调用了wrap(...),你甚至可以把你的手放在作为参数给出的lambda上,但lambda将再次拨打Otherclass.doSomething(),再次难以测试。因此,在这里进行重构可能是更好的主意:注入Otherclass的实例而不是静态调用,在测试和宾果游戏中使用模拟,您可以验证Otherclass.doSomething()被调用:

doSomething