假设我有一个接口有很多(如30个)类似getter的方法。
我想验证所有被调用的方法,而不是指定每个方法(如果接口获得更新,我们就会失败)。
现在我将编写一个简单的Java代理处理程序,但我很好奇是否有办法在Mockito中执行此操作。
答案 0 :(得分:0)
我最后只使用了代理。我想我会把它发给别人。 它不优雅,但有效。
可以添加其他验证方法,例如方法的子集或超集验证,而不是完全匹配。
@Test
public void test() {
VerifyAllMethods h = new VerifyAllMethods() {
@Override
public Object runMethod(Method method, Object[] args) throws Throwable {
Class<?> rt = method.getReturnType();
if (Optional.class.equals(rt)) {
return Optional.absent();
}
else if (String.class.equals(rt)) {
return "mock";
}
else if (Integer.class.equals(rt)) {
return 1;
}
else if (List.class.equals(rt)) {
return Lists.newArrayList("1");
}
else {
return rt.newInstance();
}
}
};
SomeInterface mf = h.mock(SomeInterface.class);
// do something with SomeInterface
h.validateEquals(SomeInterface.class);
}
public abstract static class VerifyAllMethods implements InvocationHandler {
private final Set<Method> actualMethods = Sets.newLinkedHashSet();
public VerifyAllMethods() {
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
actualMethods.add(method);
return runMethod(method, args);
}
public abstract Object runMethod(Method method, Object[] args) throws Throwable;
public Set<Method> getActualMethods() {
return actualMethods;
}
public void validateEquals(Class<?> iface) {
Set<Method> methods = Sets.newHashSet(iface.getMethods());
/*
* Asserting Equals on strings is better for IDE as
* most generate a diff.
*/
assertEquals(methodsToString(methods), methodsToString(actualMethods));
}
public String methodsToString(Iterable<Method> methods) {
List<String> names = Lists.newArrayList();
for (Method m : methods) {
names.add(m.toString());
}
Collections.sort(names);
return Joiner.on("\n").join(names);
}
@SuppressWarnings("unchecked")
public <T> T mock(Class<T> iface) {
actualMethods.clear();
Class<?>[] interfaces = {iface};
return (T) Proxy.newProxyInstance(getClass().getClassLoader(), interfaces , this);
}
}