Java 依赖注入,模仿来自外部库的东西?

Java 依赖注入,模仿来自外部库的东西?,java,dependency-injection,Java,Dependency Injection,我对使用依赖注入很感兴趣,但是我不知道应该如何处理没有考虑DI的外部LIB 例如,如果我有一些代码来构造项目范围内的对象,我可以使用一个接口,然后创建模拟版本以及这些对象的具体版本 但是,同样的代码也可能使用外部库来写入数据库或调用API或其他任何东西。外部库可能只提供此功能的具体实现 这意味着我的代码将混合具体和抽象的内容,并将迫使我在测试外部库的同时测试其余代码 我是否应该为所有外部类创建包装器,以便在其中注入模拟版本?这似乎需要做大量的工作。如果您确实必须创建具体的第三方依赖项的模拟,以便

我对使用依赖注入很感兴趣,但是我不知道应该如何处理没有考虑DI的外部LIB

例如,如果我有一些代码来构造项目范围内的对象,我可以使用一个接口,然后创建模拟版本以及这些对象的具体版本

但是,同样的代码也可能使用外部库来写入数据库或调用API或其他任何东西。外部库可能只提供此功能的具体实现

这意味着我的代码将混合具体和抽象的内容,并将迫使我在测试外部库的同时测试其余代码


我是否应该为所有外部类创建包装器,以便在其中注入模拟版本?这似乎需要做大量的工作。

如果您确实必须创建具体的第三方依赖项的模拟,以便隔离您自己的单元,那么您可以使用模拟框架(例如使用工具)非常轻松地做到这一点


单元测试应该告知并加强您的设计决策,而不是驱动它们,并且您应该能够快速编写它们,以便将大部分精力集中在实际代码的设计和实现上。像Mockito这样的现代框架使这成为可能。

您还可以轻松地使用针头框架测试代码。它与Mockito和EasyMock集成得很好。针头通过分析依赖关系和模拟对象的自动注入来减少测试设置代码。

您有具体的例子吗?你知道模拟框架也可以创建具体类的模拟吗?这完全取决于。但是,如果您正在测试依赖于第三方库的代码,那么您的测试对于单元测试来说已经太广泛了,并且是一个集成测试。我不明白为什么在大多数情况下需要为外部类创建包装器,但是,你不能模拟它们吗?这是测试驱动设计的概念。因此,我并不完全同意你的观点。在“驱动”这个词的使用上,这是一个很好的语义差异(在我所陈述的观点和测试驱动设计的观点之间)。我偶尔使用测试驱动的开发技术,但我仍然认为它比驱动程序更像是一种“通知”。问题解决空间应该是真正的驱动因素,测试技术应该是有用的信息提供者。当然,我相信一些可怜的人永远不会同意这种观点。