Mocking обычно работает хорошо, если вы используете инверсию управления и внедрение зависимостей для подключения ваших услуг.Таким образом, ваш человек должен выглядеть так:
public class Person() {
WebService ws = null;
// or use setters instead of constructor injection
Persion(WebService ws) {
this.ws = ws;
}
public Person find(int id) {
return ws.getPersonById(id);
}
}
. Надеюсь, ясно, что с этим изменением вы теперь можете создать макет и макет для WebService и просто включить его в свой тест, потому что, когда вы создаете Personчтобы проверить, вы можете передать макет конструктору (или установщику, если вы идете по этому пути).
В вашей реальной среде контейнер IoC внедрит реальный веб-сервис в.
Теперь, если вы не хотите иметь дело со всем этим IoC, вам нужно отсоединить ваш веб-сервис от вашего Person (который должен быть вызван PersonService или чем-то, а не просто Person, что обозначает сущность).Другими словами, при написании кода вы можете использовать только один тип WebService.Вам нужно сделать так, чтобы Person просто нуждался в некотором типе WebService, а не в конкретном, который вы жестко запрограммировали.
Наконец, в написанном коде WebService является классом, а не интерфейс.WebService должен быть интерфейсом, и вы должны реализовать его.EasyMock хорошо работает с интерфейсами;он может быть в состоянии смоделировать конкретные классы (это было давно, так как я фактически использовал его), но в качестве принципа проектирования вы должны указать требуемый интерфейс, а не конкретный класс.