java - Mockito:以复杂对象作为参数的 stub 方法

标签 java parameters mockito stub

也许这是一个新手问题,但找不到答案。

我需要用 Mockito stub 一个方法。如果该方法具有“简单”参数,那么我可以做到。例如,带有两个参数的 find 方法,汽车颜色和门数:

 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);

问题是 find 参数是一个复杂的对象。

 mappingFilter = new MappingFilter();
 mappingFilter.setColor(eq(Color.RED));
 mappingFilter.setDoorNumber(anyInt());
 when(carFinderMock.find(mappingFilter)).thenReturn(Car1);

此代码无效。错误是“参数匹配器的使用无效!预期 1 个匹配器,记录 2 个”。

不能修改“find”方法,需要是MappingFilter参数。

我想我必须做“某事”来指示 Mockito,当 mappingFilter.getColor 为红色且 mappingFilter.getDoorNumber 为任意时,它必须返回 Car1(其他两个句子也是如此)。 但是如何呢?

最佳答案

使用 Hamcrest 匹配器,如 the documentation 中所示:

when(carFinderMock.find(argThat(isRed()))).thenReturn(car1);

其中 isRed() 定义为

private Matcher<MappingFilter> isRed() {
    return new BaseMatcher<MappingFilter>() {
        // TODO implement abstract methods. matches() should check that the filter is RED.
    }
}

关于java - Mockito:以复杂对象作为参数的 stub 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15140467/

相关文章:

java - 服务器和 iPhone/Android 客户端上的号码生成验证

java - 接口(interface)上的注释?

design-patterns - 什么是进行函数参数检查的干净方法(或模式)?

c++ - 通过引用 C 函数的参数

go - 如何在 Go 中使用中缀(比较)运算符作为参数

java - 方法 play(Class<T>) 不适用于参数 (Class)

android - 带有 Mockito 或 Easy Mock 的 Robotium

java - 乘以 double 时索引超出范围

unit-testing - Dart Angular 在单元测试中用模拟替换提供者

java - 尝试在空对象引用上调用虚拟方法 'void android.view.View.measure(int, int)'