假设我有以下课程
public abstract class Foo{
public int bar(){
//implementation
}
public abstract int bar2();
}
和一个基类,以便更轻松地为此类编写装饰器
public class FooWrapper{
private final Foo delegate;
protected FooWrapper( Foo delegate ){
this.delegate = delegate;
}
@Override
public int bar(){
return delegate.bar()
}
@Override
public int bar2(){
return delegate.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。