Я думаю, что проблему лучше всего объяснить на примере.
public class MyService {
private OtherService theOther;
public void setTheOther(OtherService srv) { theOther = srv; }
public void myBusinessStuffFor(int id) {
theOther.applyToAllWith(id, new OtherService.Action() {
public void apply(Object whatever) {
doTheHardBusinessStuffWith(whatever);
}
}
}
private void doTheHardBusinessStuffWith(Object whatever) {
// here the business stuff provided by MyService
}
}
public interface OtherService {
void applyToAllWith(int id, Action action);
public interface Action {
void applyOn(Object whatever);
}
}
Мне нравится этот шаблон, потому что он очень сплоченный. Интерфейсы действий связаны с их Сервисами. Бизнес-логика не загромождена во многих классах. Подклассы только предоставляют данные для действия и не должны быть заняты. Я принял его отсюда (http://jamesladdcode.com/?p=12). Проблема в том, что я не нашел хорошего решения для тестирования поведения в методе "doTheHardBusinessStuffWith (Object независимо от того, что))", если я издеваюсь над другим сервисом. все равно, как вызывается бизнес-метод. Но как я могу это сделать. Я использую mockito и уже пробовал его с ArgumentCapture. Но он не чувствует себя хорошо из-за злоупотребления ArgumentCapture.
Я хотел бы знать, имеет ли имя шаблон, используемый в классе MyService.myBusinessStuffFor (int id) (это шаблон стратегии)?
Но мой главный вопрос - как сделать этот код тестируемым с помощью макета OtherService?