忽略模拟对象传递依赖项

时间:2014-01-20 15:01:40

标签: dependency-injection mocking mockito guice

当一个类实现一个接口时,我们所要做的就是模拟该接口。

但是在某些情况下,当一个类没有实现一个接口时,在这种情况下,将类绑定到一个模拟引导guice来获取模拟的对象依赖项。

澄清:

class A {
    @Inject B;
}

class B{
   @Inject C;    
}

bind(a.class).toInstance(mock(B.class));

在这种情况下,我不关心B的依赖关系,但是guice仍在尝试在B中注入C.

有没有办法在不定义界面的情况下避免这种情况?

2 个答案:

答案 0 :(得分:1)

首先,我强烈建议不要在单元测试中使用依赖注入。当您对单个类进行单元测试时,您应该创建它并通过构造函数或方法直接传递其依赖项。那时你不会遇到这些问题。

当你编写集成测试时,这是另一个故事。您的问题有几种解决方案。

  1. 确保所有类仅通过可注入的构造函数接收依赖项。这样Guice不会注入任何东西,因为该对象将由Mockito创建。

  2. 使用提供程序(如果需要,还可以使用范围)。以下相当于您尝试注入B(我假设您的确意味着bind(B.class).toInstance(mock(B.class))

    bind(B.class).toProvider(new Provider<B> {
        @Override
        public B get() {
            return mock(B.class);
        }
    }).in(Singleton.class);
    
  3. 您应该调整范围以满足您的需求。

答案 1 :(得分:0)

使用Mockito来解决这个问题非常容易。

您需要使用@Mock@InjectMocks这样的注释

ATest{
   @Mock B;
   @InjectMocks A;

   public void setUp(){
       MockitoAnnotations.initMocks(this);
   }
}

这样Mockito会执行注入而不是guice,有几个restrictions可以成功注入模拟。

这很有效,直到你的代码对一个类有很强的依赖性。

让我们说内部A我有类似C obj = new C();和C注入了字段。