Общая идея модульного тестирования такого класса будет такой же, как и для любого другого класса:
- создание Mock-версии зависимостей (Display, EventBus и т. Д.)
- установить ожидания относительно того, что должны делать зависимости при работе докладчика
- тренируй Ведущего и проверяй ожидания
Однако есть несколько проблем с вашей версией Presenter:
Метод loadDbData () не показан, но я предположил, что это означает, что Presenter также имеет доступ к некоторому другому компоненту, который выполняет выборку. Может ли этот компонент быть извлечен в зависимости, и высмеивать понравился остальным?
Затем идет проверка bind (). Единственная ответственность вашего докладчика в этом методе заключается в настройке обратных вызовов для некоторых кнопок, предоставляемых дисплеем. То, что вы хотите проверить, это:
- что обратные вызовы установлены
- что установленные обратные вызовы делают ожидаемые вещи
Несколько идей, которые помогут позже:
Вы можете уменьшить связь между Presenter и Button. Если возможно, измените интерфейс дисплея с:
Button getAddButton();
до
addAddButtonClickedHandler(ClickHandler);
Это означает, что вашему докладчику не нужно использовать объект Display, который возвращает фактический BUtton
Вы можете уменьшить количество обратных вызовов до вызова одного метода, который затем можно протестировать изолированно
protected void bind() {
display.addAddButtonClickHandler(new ClickHandler() {
public void onClick(ClickEvent) {
fireAdded();
}
});
}
// The fireAdded function can be tested independenty of the Display, potentially with
// a mock EventBus
protected void fireAdded() {
event.fireEvent(....)
}
Если вы действительно хотите проверить, правильно ли установлены обратные вызовы, вы можете использовать «фиктивную» реализацию класса Display, которая предоставит вам список всех обратных вызовов и позволит вам вызывать их
private class DummyDisplay implements Display {
private List<ClickHandler> addButtonClickHandlers;
public void addAddButtonClickHandler(ClickHandler handler) {
addButtonClickHandlers.add(handler);
}
public void fireAddButtonClick() {
for (ClickHandler h in addButtonClickHandlers) {
h.onClick(new ClickEvent());
}
}
// ....
}
Тогда ваш тест будет:
- создать докладчика с таким фиктивным дисплеем
- используйте bind для установки обратных вызовов
- используйте display.fireAddButtonClick () для имитации нажатия пользователем
- проверка, которая имеет результат нажатия, видны эффекты fireAdded
Этот тип класса (который в основном склеивает другие классы) может быть сложным для тестирования; в какой-то момент, если другие классы будут тщательно протестированы, он может стать немного контрпродуктивным, сконцентрировавшись на клеях, а не на клеях.
Надеюсь, это поможет.