And*_*age 9 java parameters stub mockito
也许这是一个新手问题,但找不到答案.
我需要使用Mockito存根方法.如果方法有"简单"参数,那么我就可以做到.例如,一个包含两个参数的车辆颜色和门数的查找方法:
when(carFinderMock.find(eq(Color.RED),anyInt())).thenReturn(Car1);
when(carFinderMock.find(eq(Color.BLUE),anyInt())).thenReturn(Car2);
when(carFinderMock.find(eq(Color.GREEN), eq(5))).thenReturn(Car3);
Run Code Online (Sandbox Code Playgroud)
问题是find参数是一个复杂的对象.
mappingFilter = new MappingFilter();
mappingFilter.setColor(eq(Color.RED));
mappingFilter.setDoorNumber(anyInt());
when(carFinderMock.find(mappingFilter)).thenReturn(Car1);
Run Code Online (Sandbox Code Playgroud)
此代码不起作用.错误是"无效使用参数匹配器!1匹配器预期,2记录".
无法修改"find"方法,它需要是MappingFilter参数.
我想我必须做"某事"来表示Mockito,当mappingFilter.getColor为RED,而mappingFilter.getDoorNumber为any时,则必须返回Car1(对于其他两个句子也是如此).但是怎么样?
JB *_*zet 10
使用Hamcrest匹配器,如文档中所示:
when(carFinderMock.find(argThat(isRed()))).thenReturn(car1);
Run Code Online (Sandbox Code Playgroud)
在哪里isRed()定义为
private Matcher<MappingFilter> isRed() {
return new BaseMatcher<MappingFilter>() {
// TODO implement abstract methods. matches() should check that the filter is RED.
}
}
Run Code Online (Sandbox Code Playgroud)
从2.1.0开始,Mockito 在界面之上构建了自己的匹配器机制org.mockito.ArgumentMatcher。这可以避免使用 Hamcrest。用法与 Hamcrest 几乎相同。请记住,这ArgumentMatcher是一个函数式接口,并且匹配的实现可以表示为 lambda 表达式。
private ArgumentMatcher<SomeObject> isYellow() {
return argument -> argument.isYellow();
}
Run Code Online (Sandbox Code Playgroud)
进而
when(mock.someMethod(argThat(isYellow()).thenReturn("Hurray");
Run Code Online (Sandbox Code Playgroud)