我有一段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表达式之外的任何操作。我该如何做到这一点?
答案 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