Próbuję przetestować klasę abstrakcyjną, a Mockito nie inicjuje moich zmiennych składowych. Oto prosty przykład, aby pokazać ci mój problem.Dlaczego Mockito pomija inicjalizację zmiennej składowej mojej abstrakcyjnej klasy
Jest to klasa abstrakcyjna, która inicjuje jego „pole” członek:
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();
}
Tutaj klasa Test:
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"));
}
}
Kiedy test jest go uruchomić rzuca NPE ponieważ pole zmiennej” "nie jest zainicjowany!
Co robię źle?
Korzystanie z http://docs.mockito.googlecode.com/hg/org/mockito/stubbing/OngoingStubbing.html#thenCallRealMethod%28%29 nie jest zalecane. Co chcesz przetestować? Jeśli jest to implementacja niektórych metod Foo, po prostu utwórz podklasę. Użyj Mockito, jeśli chcesz zweryfikować zachowanie lub wywołać metody standardowe. –
Jak już powiedziałem do [@ david-wallace] (http://stackoverflow.com/users/1081110/david-wallace), chcę przetestować klasę abstrakcyjną. Moją intencją użycia makiety było zapobieganie błędowi kompilacji w przypadku zmiany klasy abstrakcyjnej lub jednego z jej interfejsów. – Pigelvy