2014-01-20 86 views
0

当一个类实现一个接口时,我们所要做的就是模拟该接口。忽略模拟对象传递依赖

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

澄清:

class A { 
    @Inject B; 
} 

class B{ 
    @Inject C;  
} 

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

在这种情况下,我不关心B的依赖关系,但吉斯剧照试图注入C内B.

是否有办法避免这种情况而不定义接口?

回答

1

首先,我强烈推荐在单元测试中使用依赖注入。当你单元测试单个类时,你应该创建它并通过构造函数或方法直接传递它的依赖。那么你将不会有这些问题。

虽然你正在编写集成测试,但这是另一个故事。您的问题有几种解决方案。

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

  2. 使用提供者(如果需要,也可以使用范围)。以下是相当于你尝试SANS注入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); 
    

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

+0

提供商正是我一直在寻找。对于。 – Axxiss

0

使用Mockito来部分解决这个问题非常简单。

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

ATest{ 
    @Mock B; 
    @InjectMocks A; 

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

这样会的Mockito做注射代替吉斯,有一对夫妇的restrictions成功注入模拟。

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

让我们说里面我有类似C obj = new C();和C有注入字段。