Ich versuche eine abstrakte Klasse zu testen und Mockito initialisiert meine Membervariablen nicht. Hier ist ein einfaches Beispiel, um Ihnen mein Problem zu zeigen.Warum überspringt Mockito die Initialisierung der Membervariablen meiner abstrakten Klasse
Dies ist eine abstrakte Klasse, die ihr 'Feld' Mitglied initialisiert:
import java.util.ArrayList;
import java.util.Collection;
public abstract class Foo {
private final Collection field = new ArrayList();
protected Foo() {
System.out.println("In constructor");
}
public boolean isNull(Object o) {
field.add(o);
return o == null;
}
abstract void someAbstractMethod();
}
Hier die Testklasse:
import org.junit.Assert;
import org.junit.Test;
import org.mockito.Mockito;
public class FooTest {
@Test
public void testSomething() {
final Foo foo = Mockito.mock(Foo.class);
Mockito.when(foo.isNull(Mockito.anyObject())).thenCallRealMethod();
Assert.assertFalse(foo.isNull("baaba"));
}
}
Wenn der Test wirft, weil die Variable ‚Feld ein NPE ausgeführt wird 'ist nicht initialisiert!
Was mache ich falsch?
Die Verwendung von http://docs.mockito.googlecode.com/hg/org/mockito/stubbing/OngoingStubbing.html#thenCallRealMethod%28%29 wird nicht empfohlen. Was willst du testen? Wenn es die Implementierung einiger Methoden von Foo ist, dann erstellen Sie einfach eine Unterklasse. Verwenden Sie Mockito, wenn Sie Verhaltens- oder Stub-Methodenaufrufe verifizieren möchten. –
Wie ich zu [@ david-wallace] (http://stackoverflow.com/users/1081110/david-wallace) gesagt habe, möchte ich die abstrakte Klasse testen. Meine Absicht, einen Mock zu verwenden, bestand darin, Kompilierungsfehler zu vermeiden, sollte sich die abstrakte Klasse oder eine ihrer Schnittstellen ändern. – Pigelvy