假设我有以下类在单元测试的所有方法是否委托检查
public abstract class Foo{
public int bar(){
//implementation
}
public abstract int bar2();
}
和一个基类,使其更易于编写装饰该类
类FooWrapper
允许您为Foo
编写装饰器,您只需重写所需的方法。
现在我想写一个测试FooWrapper
它检查是否所有的方法默认委托。当然,我也喜欢写东西
@Test
public void barShouldBeDelegated(){
Foo delegate = Mockito.mock(Foo.class);
FooWrapper wrapper = new FooWrapper(delegate);
wrapper.bar();
Mockito.verify(delegate).bar();
}
但是这需要我的每一个方法添加到Foo
时添加一个新的测试方法。我希望有一个测试,每次向Foo
添加一个方法时我都会失败,我忘记了在FooWrapper
中覆盖和委托。
我正在尝试使用反射,它允许我调用每个方法,但我不知道如何检查方法是否实际委派。请参阅以下代码片段,了解我正在玩弄的想法:
@Test
public void testAllMethodsAreDelegated() throws Exception{
Foo delegate = mock(Foo.class);
FooWrapper wrapper = new FooWrapper(delegate);
Class<?> clazz = wrapper.getClass();
Method[] methods = clazz.getDeclaredMethods();
for (Method method : methods) {
Class<?>[] parameterTypes = method.getParameterTypes();
Object[] arguments = new Object[parameterTypes.length];
for (int j = 0; j < arguments.length; j++) {
arguments[j] = Mockito.mock(parameterTypes[j]);
}
method.invoke(wrapper, arguments);
// ?? how to verify whether the delegate is called
// Mockito.verify(delegate).??? does not work
// as I cannot specify the method by name
}
}
}
任何想法是否可以编写这样的测试。请注意,我唯一可以使用的模拟框架是Mockito。
不错的描述和不错的想法:) –
你能得到一些可以接受的答案吗?它有一个非常致命的缺陷,它并没有真正验证委托方法被调用(见下面的评论)。 – Krease
@Krease我用接受的答案,它似乎工作。当包装程序未调用委托时,测试失败。只要在包装器和委托中使用相同的方法(总是在他们相互扩展的情况下看到的情况)将会通过测试。所以我不知道我100%理解你的评论 – Robin