Mockito验证所有类似getter的接口方法都被调用

时间:2016-04-30 16:02:08

标签: java mocking mockito

假设我有一个接口有很多(如30个)类似getter的方法。

我想验证所有被调用的方法,而不是指定每个方法(如果接口获得更新,我们就会失败)。

现在我将编写一个简单的Java代理处理程序,但我很好奇是否有办法在Mockito中执行此操作。

1 个答案:

答案 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);
    }

}