我有GPS阅读器类,可以从GPS接收器提供坐标。这适用于具有真实接收器的机器。现在我创建了一个模型类,它随机给我坐标,这样我就可以启动我的应用程序,看看是否一切正常,而不必将其部署到另一台机器上。
现在这是结构:
class AbstractGPSReader {
}
class RealGPSReader extends AbstractGPSReader {
}
class FakeGPSReader extends AbstractGPSReader {
}
class SomeOtherClass {
private AbstractGPSReader gpsReader = new RealGPSReader();
}
为了能够测试我必须替换的应用程序
new RealGPSReader()
与
new FakeGPSReader()
有更优雅的方式吗? 我可以阻止某人在制作中使用这个类吗?
答案 0 :(得分:2)
您应该使用dependency injection。这很简单:应该为类提供其依赖项的实例,而不是自己创建依赖项。
例如:
class SomeOtherClass {
private final AbstractGPSReader gpsReader = new RealGPSReader();
}
成为:
class SomeOtherClass {
private final AbstractGPSReader gpsReader;
public SomeOtherClass(AbstractGPSReader gpsReader) {
this.gpsReader = gpsReader;
}
}
这样做的好处是,现在SomeOtherClass
仅与AbstractGPSReader
相关联,而在它与AbstractGPSReader
和RealGPSReader
相关联之前。
在编写单元测试时,这是一个巨大的好处,因为现在该类可以被未经修改的测试套件使用:
void testSomeOtherClass() {
SomeOtherClass someOtherClass = new SomeOtherClass(new FakeGPSReader());
someOtherClass.someMethod();
// etc...
}
有些框架可以帮助您自动注入依赖项,但我建议不要使用这些框架来保持代码的简单性。
顺便说一句,您应该尝试围绕接口而不是抽象类构建API。