如何断言是否调用了lambda

问题描述

我目前正在使用lambda(消费者或函数)作为方法的参数。

我想知道断言lambda是否已执行的最佳方法是什么。

我找到了2种解决方案,不知道哪种解决方案更好,或者是否还有其他解决方案。

  1. 使用列表并在每次调用消费者时添加对象
   List<Object> listCall = new ArrayList<>()
   myObject.myMethod((param)->listCall.add(param))
   asserThat(listCall).hasSize(wantednumberCall)

专业版:此功能有效。您可以计算通话次数

缺点:为测试类似的东西而添加自定义lambda有点尴尬

  1. 使用Mockito模拟用户/功能
   myObject.myMethod(consumerMock)
   Mockito.verify(consumerMock,Mockito.times(0)).apply(any());

专业版:Mockito有很多选项可以计算带有参数的调用

缺点:Mockito不建议模拟您不拥有的对象。而且有时需要模拟的不只是apply(Consumer)或accept(Consumer)

解决方法

可能有点过大,但是除了使用StackWalker完全将断言与lambda分开之外,什么都没想到。只需声明您的consumerMock在堆栈中的位置即可

https://docs.oracle.com/javase/9/docs/api/java/lang/StackWalker.html