如何采用lambda表达式的特定类,例如方法参数中类型的子类

时间:2016-07-27 02:50:29

标签: lambda mockito

我正在尝试为模拟测试添加自定义ArgumentMatcher(subclass of Matcher),以下是代码:

when(mockedObject.mockedMethod(
   argThat((int id)-> id > 5 || id < 1 ? false : true)));

但我收到错误:

  

在org.hamcrest.Matcher接口中找到多个非重写抽象方法

我知道argThat定义为:

public static <T> T argThat(Matcher<T> matcher)

我可以告诉编译器我想在lambda表达式中使用ArgumentMatcher而不是Matcher吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

不,你想要的是不可能的。 org.hamcrest.Matcher不是功能界面。它有多个非抽象方法。例如,以下任何一个:

  • org.hamcrest.SelfDescribing.describeTo(Description)
  • org.hamcrest.Matcher.matches(Object)

编译器需要将lambda转换为功能接口的实现。但ArgumentMatcher本身已经是一个类。

作为一种解决方法,您可以创建自己的argThat版本,该版本会收到java.util.function.Predicate并将其转换为Matcher实施。但是,您将失去SelfDescribing的支持,并且必须忍受错误的故障描述。