Angenommen delegiert Ich habe die folgende Klassein einem Unit-Test prüfen, ob alle Methoden
public abstract class Foo{
public int bar(){
//implementation
}
public abstract int bar2();
}
und eine Basisklasse zu erleichtern Dekorateure für diese Klasse
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();
}
}
Die Klasse zu schreiben FooWrapper
können Sie einen Dekorator für Foo
schreiben, wo Sie nur die Methoden überschreiben, die Sie benötigen.
Jetzt möchte ich einen Test für FooWrapper
schreiben, die überprüft, ob alle Methoden standardmäßig delegiert sind. Natürlich kann ich so etwas wie
@Test
public void barShouldBeDelegated(){
Foo delegate = Mockito.mock(Foo.class);
FooWrapper wrapper = new FooWrapper(delegate);
wrapper.bar();
Mockito.verify(delegate).bar();
}
schreiben Aber dies erfordert mir eine Methode, um Foo
hinzugefügt wird, eine neue Testmethode jedes Mal hinzuzufügen. Ich hatte gehofft, einen Test zu haben, der jedes Mal fehlschlagen würde, wenn ich eine Methode zu Foo
hinzufüge, die ich vergessen habe zu überschreiben und in FooWrapper
delegieren.
Ich habe versucht, Reflexion zu verwenden, die mir erlaubt, jede Methode aufzurufen, aber ich weiß nicht, wie man überprüft, ob die Methode tatsächlich delegiert wird. Siehe das folgende Snippet für die Idee, die ich mit liebäugelt:
@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
}
}
}
Irgendwelche Ideen, ob es möglich ist, einen solchen Test zu schreiben. Beachten Sie, dass das einzige Mock-Framework, das ich verwenden kann, Mockito ist.
Schöne Beschreibung und nette Idee :) –
Konnten Sie etwas erhalten, das von der angenommenen Antwort funktioniert? Es hat einen ziemlich fatalen Fehler darin, dass es nicht wirklich überprüft, dass die Delegate-Methode aufgerufen wurde (siehe Kommentar unten). – Krease
@Krease Ich habe die angenommene Antwort verwendet und es scheint zu funktionieren. Tests schlagen fehl, wenn der Wrapper den Delegaten nicht aufruft. Wenn Sie nur die gleichen Methoden im Wrapper und im Delegaten verwenden (was immer der Fall ist, wenn Sie sich gegenseitig erweitern), wird der Test fehlschlagen. Also ich bin mir nicht sicher, ob ich deine Bemerkung 100% verstehe. – Robin