如何正确分离生产和模型类

时间:2017-01-10 09:37:55

标签: java

我有GPS阅读器类,可以从GPS接收器提供坐标。这适用于具有真实接收器的机器。现在我创建了一个模型类,它随机给我坐标,这样我就可以启动我的应用程序,看看是否一切正常,而不必将其部署到另一台机器上。

现在这是结构:

class AbstractGPSReader {
}

class RealGPSReader extends AbstractGPSReader {
}

class FakeGPSReader extends AbstractGPSReader {
}

class SomeOtherClass {
    private AbstractGPSReader gpsReader = new RealGPSReader();
}

为了能够测试我必须替换的应用程序

new RealGPSReader()

new FakeGPSReader()

有更优雅的方式吗? 我可以阻止某人在制作中使用这个类吗?

1 个答案:

答案 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相关联,而在它与AbstractGPSReaderRealGPSReader相关联之前。

在编写单元测试时,这是一个巨大的好处,因为现在该类可以被未经修改的测试套件使用:

void testSomeOtherClass() {
    SomeOtherClass someOtherClass = new SomeOtherClass(new FakeGPSReader());
    someOtherClass.someMethod(); 
    // etc... 
}

有些框架可以帮助您自动注入依赖项,但我建议不要使用这些框架来保持代码的简单性。

顺便说一句,您应该尝试围绕接口而不是抽象类构建API。