我想模拟一个具有可变参数参数方法的类。基于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()
我缺少什么?
最佳答案
更改您的 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/