如何对可调用的 lambda 表达式进行单元测试?



我有一段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 表达式之外的任何操作。我该如何实现此目的?

我不确定,但我相信你只是想模拟一个静态方法。您可以按照第一个答案中的示例进行操作:PowerMockito 模拟单个静态方法并返回对象

对于验证调用,您可以使用PowerMockito中的verifyStatic方法 https://automationrhapsody.com/verify-static-method-called-powermock/

正如@staszko032已经指出的那样,你的问题不在于lambda,你的问题是静态方法调用 - 这通常是...后面测试。只要Wrapper.wrap(或者,更有可能是Otherclass.doSomething())是静态调用,你就需要像PowerMockito这样的复杂工具。你不能指望抛出静态调用,仍然得到很好的可测试代码 - 这不是它的工作原理,对不起。就个人而言,我倾向于说PowerMockito是一种用于解决您只有因为代码不好而遇到的问题的工具。重构(如果可能)应始终优先于 PowerMockito 或类似工具。

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

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

public class MyClass {
private OtherClass otherClassInstance; // setter/constructor/autowire/whatever     
public Response someMethod() {
Response response = Wrapper.wrap( () -> {
return otherClassInstance.doSomething(); // now that's testable
});
// .... do something else ....
return Response;
}
}

相关内容

  • 没有找到相关文章