如果您使用控制反转和依赖注入来连接您的服务,则模拟通常效果很好。所以你的人应该看起来像
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 创建一个 mock 和 mock 控件并将其插入到您的测试中,因为当您创建要测试的 Person 时,您可以将 mock 传递给构造函数(或 setter如果你走那条路)。
在您的真实环境中,IoC 容器将注入真实的 Web 服务。
现在,如果你不想处理所有这些 IoC 的东西,你需要做的是将你的 web 服务与你的 Person 分离(应该调用 PersonService 或其他东西,而不仅仅是表示实体的 Person)。换句话说,代码的编写方式你只能使用一种类型的 WebService。您需要这样做,因此 Person 只需要某种类型的 WebService,而不是您硬编码的特定 WebService。
最后,在编写的代码中,WebService 是一个类,而不是一个接口。WebService 应该是一个接口,并且您应该放入某种实现。EasyMock 与接口配合良好;它可能能够模拟具体类(自从我实际使用它以来已经有一段时间了),但作为设计原则,您应该指定所需的接口,而不是具体类。