Я использую GWTP, добавляя уровень контракта для абстрагирования знаний между Presenter и View, и я очень доволен результатом с GWTP. Я тестирую своих докладчиков с помощью Mockito.
Но со временем я обнаружил, что с его тестами трудно поддерживать чистый презентер. Я сделал некоторые рефакторинги, чтобы улучшить это, но я все еще не был удовлетворен.
Я обнаружил, что суть дела заключается в следующем: моим докладчикам часто требуется асинхронный вызов или вообще вызов метода объектов с обратным вызовом, чтобы продолжить мой поток докладчика (обычно они вложены).
Например :
this.populationManager.populate(new PopulationCallback()
{
public void onPopulate()
{
doSomeStufWithTheView(populationManager.get());
}
});
В своих тестах я закончил проверку вызова населения() смоделированного объекта PopulationManager. Затем создать еще один тест для метода doSomeStufWithTheView().
Но я довольно быстро обнаружил, что это был плохой дизайн: любое изменение или рефакторинг заканчивались поломкой многих моих тестов и вынуждали меня создавать с самого начала другие, хотя функциональность презентера не менялась! Кроме того, я не проверял, действительно ли обратный вызов был тем, что я хотел.
Поэтому я попытался использовать метод mockito doAnswer, чтобы не нарушать процесс тестирования докладчика:
doAnswer(new Answer(){
public Object answer(InvocationOnMock invocation) throws Throwable
{
Object[] args = invocation.getArguments();
((PopulationCallback)args[0]).onPopulate();
return null;
}
}).when(this.populationManager).populate(any(PopulationCallback.class));
Я учел код, чтобы он был менее подробным (и внутренне менее зависимым от позиции arg):
doAnswer(new PopulationCallbackAnswer())
.when(this.populationManager).populate(any(PopulationCallback.class));
Таким образом, издеваясь над менеджером населения, я все еще мог протестировать поток моего ведущего, в основном так:
@Test
public void testSomeStuffAppends()
{
// Given
doAnswer(new PopulationCallbackAnswer())
.when(this.populationManager).populate(any(PopulationCallback.class));
// When
this.myPresenter.onReset();
// Then
verify(populationManager).populate(any(PopulationCallback.class)); // That was before
verify(this.myView).displaySomething(); // Now I can do that.
}
Мне интересно, является ли это хорошим использованием метода doAnswer, или это запах кода, и можно использовать лучший дизайн?
Обычно мои докладчики, как правило, просто используют другие объекты (например, какой-либо шаблон посредника) и взаимодействуют с представлением. У меня есть презентатор с несколькими сотнями (~ 400) строк кода.
Опять же, является ли это доказательством плохого дизайна или для ведущего нормально быть многословным (потому что он использует другие объекты)?
Кто-нибудь слышал о каком-то проекте, который использует GWTP и чисто тестирует своего презентатора?
Надеюсь, объяснил доходчиво.
Заранее спасибо.
PS: я новичок в Stack Overflow, плюс мой английский все еще не хватает, если мой вопрос нуждается в чем-то, пожалуйста, скажите мне.