java - 访问 stub 方法的可变参数以返回不同的结果

标签 java mockito

我想模拟一个具有可变参数参数方法的类。基于is there Mockito eq matcher for varargs array?我想出了以下内容,但根本没有调用 ArgumentMatcher。

我要模拟的类(class):

public class ProcessUtil {
  public Result execute(String... commandParts) throws Exception { ... }
}

我要测试的类(InstallService)执行几个ProcessUtil.execute(),我想根据调用的可变参数返回不同的结果。因此我创建了这个 ArgumentMatcher:

class StringVarArgsMatcher implements ArgumentMatcher<String[]>,VarargMatcher {

    private String[] expectedValues;

    StringVarArgsMatcher(String... expectedValues) {
        this.expectedValues = expectedValues;
    }

    @Override
    public boolean matches(String[] arguments) {
        boolean matched = false;
        for(int i = 0; i < expectedValues.length; i++) {
            matched = "".equals(expectedValues[i]) || arguments[i].endsWith(expectedValues[i]);
        }

        return matched;
    }
}

我的测试是这样构建的:

@Test
public void test() throws Exception{
    ProcessUtil processUtilMock = mock(ProcessUtil.class);
    ProcessUtil.Result installCommandResult = new ProcessUtil.Result(Collections.emptyList(), Collections.emptyList());
    when(processUtilMock.execute(argThat(new StringVarArgsMatcher(new String[]{"", "", "", "", "--install"})))).thenReturn(installCommandResult);

    InstallService installService = new InstallService(processUtilMock);
    boolean databaseInstalled = installService.installDatabase();
    Assert.assertFalse(databaseInstalled);
}

当我运行测试时,似乎根本没有调用 ArgumentMatcher。如果我在匹配器内部设置任何断点,执行将不会停止。当我的 InstallService 尝试评估 ProcessUtil.execute()

的结果时,它也会收到 NullPointer-Exception

我缺少什么?

最佳答案

更改您的 StringVarArgsMatcher实现ArgumentMatcher<String>而不是字符串数组。

当mockito将匹配器识别为可变参数匹配器时(通过依赖VarargMatcher接口(interface)),它会单独与您的匹配器匹配每个参数。

您必须为此调整匹配器,例如:

class StringVarArgsMatcher implements ArgumentMatcher<String>,VarargMatcher {

    private String[] expectedValues;
    private int count = 0;

    StringVarArgsMatcher(String... expectedValues) {
        this.expectedValues = expectedValues;
    }

    @Override
    public boolean matches(String argument) {

        if (count >= expectedValues.length) {
            return false;
        }

        boolean result = "".equals(expectedValues[count]) || argument.endsWith(expectedValues[count]);
        count++;
        return result; 
    }
}

关于java - 访问 stub 方法的可变参数以返回不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58990082/

相关文章:

java - iText - 第二次尝试生成 PDF 失败

java - 2011 年 Swing 应用程序的首选可视化编辑器 Eclipse 插件是什么?

junit - 如何在为静态方法编写junit时从静态方法模拟实例方法调用?

java - Spring 测试和 NullPointerException

java - Mockito:两个列表上的 assertEquals,比较对象变量

java - 根据玩家位置旋转纹理

Java 通用类型不匹配错误

java - 如何从java类调用python脚本

java - 使用@category spring 和 gradle 运行 jUnit 测试

java - 如何在其他方法调用中使用传递的参数?