使用IOC 的好处 - 单元测试

282 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第8天,点击查看活动详情

这篇文章我们来介绍一下使用IOC 的好处之单元测试。

场景假设

假设一个场景,我们提供一个类,用来监听不同场所下的消费者反馈消息并将其持久化。

这些场所可能是商超、理发店、售楼处等等。

这时我们提供IFeedbackListener 作为监听类的接口;提供IFeedbackPersister 作为持久化反馈数据的接口;提供FeedbackStorage 作为接收并存储反馈消息的类。

三个接口(类)的结构如下:

class FeedbackStorage {
    IFeedbackListener feedbackListener;
    IFeedbackPersister feedbackPersister;
    public FeedbackStorage(IFeedbackListener listener, IFeedbackPersister persister) {
        this.feedbackListener = listener;
        this.feedbackPersister = persister;
    }

    // getter/setter
}

interface IFeedbackListener {

}

interface IFeedbackPersister {

}

上述代码这就是正常的使用IOC 的时候,通过构造方法进行依赖注入的方式。

如果是商超场所的反馈,我们可以通过构造函数传入SuperMarketFeedbackListener;如果是理发店,我们可以通过构造函数传入BarberShopFeedbackListener

当然,IFeedbackPersister 也需要有具体的实现。

IOC 的便利之处分析

我们这片文章的重点在说明使用IOC 的时候,对于单元测试场景的友好程度。

因为我们使用了IOC 进行注入,所以在FeedbackStorage 类中就不需要再new 一下了。

这样,我们对FeedbackStorage 进行测试的时候,其中引用了IFeedbackListener,就可以直接Mock 一个对象就可以了。如果是在FeedbackStorage 类中直接new 了一个SuperMarketFeedbackListener,那么我们无法将对SuperMarketFeedbackListener 的依赖排除在外,那么就比较难以开展单元测试了。

但是如果使用这种构造函数注入的方式进行单元测试,那么单测就可以没有其他依赖而顺利进行了。

总结

其实IOC 的好处特别多,这篇文章仅仅讲了IOC 众多优点中的一个。很多书籍或者资料、博客等提到IOC 的时候总是赞不绝口,这并不是没有原因的。当然,如果我们想要学习并理解更多的IOC 的优点,我们最好的办法就是去验证一下。实践出真知道也不是没有原因的。