gpt4 book ai didi

java - 如何模拟无法在测试中实例化的对象?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:14:37 24 4
gpt4 key购买 nike

我在测试中使用 EasyMock 模拟对象。但是我如何模拟在我的代码中其他地方创建的对象呢?看下面的伪代码。我想模拟 WebService#getPersonById,我该怎么做?

public class Person {
public Person find(int id) {
WebService ws = new WebService();
return ws.getPersonById(id);
}
}

public class PersonTest {
testFind() {
// How do I mock WebService#getPersonById here?
}
}

最佳答案

如果您使用控制反转和依赖注入(inject)来连接您的服务,模拟通常会很有效。所以你的人应该看起来像

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 传递给构造函数(如果你走那条路,或者二传手)。

在您的真实环境中,IoC 容器将注入(inject)真实的 Web 服务。

现在,如果您不想处理所有这些 IoC 的东西,您需要做的是将您的 Web 服务与您的 Person 分离(应该调用 PersonService 或其他东西,而不仅仅是表示实体的 Person)。换句话说,按照代码的编写方式,您只能使用一种类型的 WebService。您需要做到这一点,以便 Person 只需要一些类型的 WebService,而不是您硬编码的特定类型。

最后,在所写的代码中,WebService 是一个类,而不是一个接口(interface)。 WebService 应该是一个接口(interface),您应该进行某种实现。 EasyMock 与接口(interface)配合得很好;它可能能够模拟具体类(自从我实际使用它以来已经有一段时间了),但作为设计原则,您应该指定所需的接口(interface),而不是具体类。

关于java - 如何模拟无法在测试中实例化的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4807276/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com