我正在尝试为模拟测试添加自定义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吗?
谢谢!
答案 0 :(得分:1)
不,你想要的是不可能的。 org.hamcrest.Matcher
不是功能界面。它有多个非抽象方法。例如,以下任何一个:
org.hamcrest.SelfDescribing.describeTo(Description)
org.hamcrest.Matcher.matches(Object)
编译器需要将lambda转换为功能接口的实现。但ArgumentMatcher
本身已经是一个类。
作为一种解决方法,您可以创建自己的argThat
版本,该版本会收到java.util.function.Predicate
并将其转换为Matcher
实施。但是,您将失去SelfDescribing
的支持,并且必须忍受错误的故障描述。