Рассмотрим следующий класс:Как объединить тестовые узлы графа с mockito?
public class Node {
private final Collection<Node> mDependants = new ArrayList<>();
private Node mDependency;
public void initialize(final Node node) {
// complex code that might call registerDependency;
}
private void registerDependency(final Node node) {
mDependency = node;
node.registerDependent(this);
}
private void registerDependent(final Node node) {
mDependants.add(node);
}
}
, а затем модульного тестирования, как:
import static org.mockito.Mockito.mock;
public class NodeTest {
private Node mTarget;
private Node mDependent;
@Before
public void setUp() {
mTarget = new Node();
mDependent = mock(Node.class);
}
@Test
public void test() {
mTarget.initialize(mDependent);
}
}
С registerDependent является частным, Mockito не будет на самом деле дразнить его. Поскольку mTarget фактически является реальным экземпляром, когда метод registerDependency выполняется посредством инициализации, он попытается выполнить приватный метод registerDependent на макет. Макет, являющийся макетом, не будет инициализирован, а mDependants на самом деле будет пустым, вызывая NullPointerException на mDependats.add (node).
Каким должен быть правильный способ проверить это? Должен ли я использовать два реальных узла вместо макета? следует ли публиковать методы, чтобы позволить насмехаться над этим методом? Есть ли другой вариант, который мне не хватает? Final Узел узла
Я не вижу никаких проблем с вашим кодом, кроме некоторых объявлений импорта. Я не смог воспроизвести исключение NullPointerException. –