依赖注入的真实用例是什么?

Try*_*ing 4 java oop dependency-injection

我理解依赖注入,但我真正不理解的是,依赖注入的用途是什么.

正如这里提到的,这有助于轻松测试代码(这是一种非常有用的测试技术,因为它允许依赖性被模拟或删除.)但是现在有很多模拟框架,如Mockito,powermockito可以这些工作比依赖注入更好吗?

如果有人可以用代码解释那将是很好的.

提前致谢.

Bha*_*kar 8

DI作为一种技术的主要用途是:

它导致代码更容易测试(使用Mocking).这意味着为了使用模拟框架(Mockito等),你应该使用更多的DI.如果您不使用DI并编写直接实例化对象的代码 - 那么实际上您不能使用Mockito来模拟您的依赖项.

让我们说你编写代码来演奏管弦乐队.你的主要课程取决于许多其他课程(也许其他人写的).

让我们说你写了这个:

public class Orchestra {
  private Drums drum;
  private Violin violin;
  private Guitar guitar;

public Orchestra() {
    drum = new Drum();
    violin = new Violin();
    guitar = new Guitar();
}

public Music play(){
    // use above in some way to run your orchestra
    // start with violin 
    // add some guitar and then bring in the drums too
}
Run Code Online (Sandbox Code Playgroud)

}

现在,您希望确保您的逻辑play正常工作.当你上课时,你会发现音乐不是你所期望的.(也许鼓声正在开始时开始).您想测试代码的逻辑play.你会怎么做到这里?您无法控制依赖项.您不知道代码Drum或您自己的逻辑是否存在问题play().

你想在这里嘲笑 Drum.但你不能轻易做到这一点.因为您的代码不使用DI.它Drum直接在里面实例化.

现在让我们使用DI,看看它有何帮助.

public class Orchestra {
    private Drums drum;
    private Violin violin;
    private Guitar guitar;

    public Orchestra(Drums d,Violin v, Guitar g ) {
        drum = d;
        violin = v;
        guitar = g;
    }

    public Music play(){
        // use above in some way to run your orchestra
    }

}
Run Code Online (Sandbox Code Playgroud)

使用此代码,您可以轻松地Drum在测试中进行模拟.

class TestOrchestra {

    public void testPlay(){
        Drum mockDrum = mock(Drum.class);
        Violin mockViolin = mock(Violin.class);
        Guitar mockGuitar = mock(Guitar.class);
        // add mock behaviour to above , here you control precisely what these dependencies will do inside your code

        Orchestra orch = new Orchestra(mockDrum, mockViolin,mockGuitar);
        // now play and test your logic

    }

}
Run Code Online (Sandbox Code Playgroud)

使用DI的第二个好处是,它有助于改变程序较大部分的实现,而无需完成整个代码.

再次 - 参考上文,假设您一直在使用特定类型的吉他(由您的代码在内部实例化)演奏您的管弦乐队.

现在你想换成一个全新的电吉他.没有DI,你必须打开你的Orchestra课程,检查你创建的地方Guitar 并更改那行代码.您必须确保代码的其他部分不会无意中更改并进行全面测试Orchestra以确保正常工作.

使用DI,你可以避免这一切.您只需将新Guitar对象注入构造函数即可.而已.因为你已经自己测试了这个新Guitar对象(并且它符合了interface Guitar- 你可以放心,你的Orchestra代码不会因为注入这个新的吉他而破坏.这对改善你的管弦乐队来说要好得多.


Kay*_*man 7

Dependency injection不是替代品mocking frameworks.这是一个要求.如果你有硬依赖,那么模拟依赖关系并因此测试代码要困难得多.

DI还允许您拥有更松散耦合的代码.类可以简单地通过注入它们来使用其他类,而不是知道如何构造(或获取特定类)的实例.