Я пытаюсь проверить абстрактный класс, а Mockito не инициализирует мои переменные-члены. Вот простой пример, чтобы показать вам мою проблему.Почему Mockito пропускает инициализацию переменной-члена моего абстрактного класса
Это абстрактный класс, который инициализирует его член «поле»:
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();
}
Вот тестовый класс:
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"));
}
}
Когда тест запускается его бросает NPE, так как поле переменной» 'не инициализируется!
Что я делаю неправильно?
Использование http://docs.mockito.googlecode.com/hg/org/mockito/stubbing/OngoingStubbing.html#thenCallRealMethod%28%29 не рекомендуется. Что вы хотите проверить? Если это реализация некоторых методов Foo, просто создайте подкласс. Используйте Mockito, когда вы хотите проверить поведение или вызовы метода заглушки. –
Как я сказал [@ david-wallace] (http://stackoverflow.com/users/1081110/david-wallace), я хочу протестировать абстрактный класс. Мое намерение использовать макет заключалось в том, чтобы предотвратить ошибку компиляции, если изменится абстрактный класс или один из его интерфейсов. – Pigelvy