在使用依赖注入时,是否有“新”的情况?

2022-09-03 01:48:38

依赖注入是否意味着您永远不需要“new”关键字?或者直接创建简单的叶类(如集合)是否合理?

在下面的示例中,我注入了比较器,query和dao,但SortedSet是直接实例化的:

public Iterable<Employee> getRecentHires()
{
    SortedSet<Employee> entries = new TreeSet<Employee>(comparator);
    entries.addAll(employeeDao.findAll(query));
    return entries;
}

答案 1

仅仅因为依赖注入是一种有用的模式并不意味着我们将其用于所有事情。即使使用DI,也经常需要新的DI。不要删除新的。


答案 2

我通常决定是否使用依赖注入的一种方法是,在为被测类编写单元测试时,我是否需要模拟或存根协作类。例如,在你的示例中,你(正确地)注入了DAO,因为如果你为你的类编写一个单元测试,你可能不希望任何数据实际写入数据库。或者,协作类可能将文件写入文件系统或依赖于外部资源。或者,该行为是不可预测的或难以在单元测试中考虑的。在这些情况下,最好注入这些依赖项。

对于像TreeSet这样的协作类,我通常不会注入这些,因为通常不需要模拟像这样的简单类。

最后要注意的是:当一个字段由于某种原因无法注入时,我仍然想在测试中模拟它,我发现Junit-addons PrivateAccessor类有助于将类的私有字段切换到由EasyMock(或jMock或您喜欢的任何其他模拟框架)创建的模拟对象。