忽略模拟的对象传递依赖性



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

但是,在某些情况下,类别不实现接口,在这种情况下,将类绑定到模拟导线,使Guice获得模拟的对象依赖关系。

澄清:

class A {
    @Inject B;
}
class B{
   @Inject C;    
}
bind(a.class).toInstance(mock(B.class));

在这种情况下,我不在乎B的依赖性,但是Guice剧照试图注入B。

有没有定义接口的方法可以避免这种情况?

首先,i 强烈建议不要在单位测试中使用依赖注入。当您单位测试单个类时,您应该创建它,并通过构造函数或方法直接通过其依赖关系。那您就不会遇到这些问题。

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

  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);
    

您应该调整范围以满足您的需求。

使用Mockito部分解决这很容易。

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

ATest{
   @Mock B;
   @InjectMocks A;
   public void setUp(){
       MockitoAnnotations.initMocks(this);
   }
}

这样,莫科托将进行注入而不是guice,有几个限制可以成功地注入模拟。

这很好,直到您的代码对课程具有很强的依赖。

在A内,我有类似c obj = new C()之类的东西;c注射了字段。

最新更新