2014-03-12 45 views
2
的Mockito

这里的问题:我有一个相当复杂的类,有很多在它定义的@Inject(其中一类Ç)。这个类的一个实例被注入到另一个类A,我想要测试它。 这个想法是,我想注入B类的模拟到A - 我希望它被Spring注入,以便在实例创建后执行init方法(因此没有@InjectMock这里有替代注射剂)。测试春:避免注射到嘲笑的对象与

Here's an example that is boiled down to three classes Bla, Blub and Blublub。我想要做的是模拟Blub并将此实例注入到BlubBlub - 我想忽略Bla的存在。

* 编辑 *

主要的一点是,我希望有一个背景下由类咕噜咕噜的模拟和类BlubBlub的一个实例。

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = MockInjectionTest.TestApp.class) 
public class MockInjectionTest { 
@Inject 
public Blub blub; 

@Inject 
public BlubBlub blubblub; 

@Configuration 
public static class TestApp { 
    @Bean 
    Blub getBlub() { 
     return mock(Blub.class); 
    } 

    @Bean 
    BlubBlub getBlubBlub() { 
     return new BlubBlub(); 
    } 
} 

@Test 
public void testBlub() { 
    Assert.assertNotNull(blub); 
} 

@Before 
public void setup() { 
    MockitoAnnotations.initMocks(this); 
} 

// the classes 
public static class Bla { 
} 

public static class Blub { 
    @Inject 
    public Bla bla; 
} 

private static class BlubBlub { 
    @Inject 
    public Blub blub; 
} 
} 

问题:当我或者通过使用@Mock或致电模拟(泡壳),明确在@Bean方法我收到以下错误时ApplicationContext被实例化(无论我定义咕噜的模拟使用xml-config或基于注解的bean定义)。

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating 
bean with name 'getBlub': Injection of autowired dependencies failed; 
nested exception is org.springframework.beans.factory.BeanCreationException: 
Could not autowire field: public Bla Blub.bla; 

所以显然Spring仍然想要实例化原始类而不是仅仅使用我提供的实例。这是接下来创建上下文所必需的(如果我手动创建上下文,并使用已在上下文构建中转储的ctx.getBean()来拉豆。

来自Guice我会简单地将我的模拟实例绑定到模块中,一切都会好的。

帮助非常感谢 - 听起来像一个标准问题,但我找不到一个简单的解决方案。

感谢和问候,弗里克

+0

这是一个遗憾,这一个没有回答,我有同样的问题 – john16384

回答

0

更改配置以

@Configuration 
public static class TestApp { 

@Bean 
Blub getBlub() { 
    return mock(Blub.class); 
} 

@Bean 
BlubBlub getBlubBlub() { 
    return new BlubBlub(); 
} 

@Bean 
Bla getBla() { 
    return mock(Bla.class) 
} 

} 

什么春天抱怨的事实是,没有布拉实施存在于应用程序上下文和那里没有注射可以进行

+0

嗨@geoand,感谢您的快速回复;我有这样的想法,但假设我有十个这样的Bla ** - 应该被注入的类,那么我最终会得到一个庞大的“纯”的样板文件,这只是因为Spring将事物引入上下文我不想在那里。毕竟他们甚至没有注入。我想要一个包含Blub类模拟和BlubBlub类实例的环境。也许这对于Spring来说是不可能的,并且这是坚持Guice的好处之一。 – fricke

+0

这是一个很好的问题。如果是这样的话,你应该签出像你习惯的@InjectMock一样工作的Springockito项目。 http://stackoverflow.com/q/19354473/2504224 – geoand

+0

嗨@geoand,不幸的是,Springockito帮助解决了Spring的问题,同时为所有“@Inject-ed”类构建上下文检查,并在那里中断。 – fricke

0

你可以这样返回一个空豆:

@Configuration 
public static class TestApp { 
    @Bean 
    Blub getBlub() { 
     return mock(Blub.class); 
    } 
    @Bean 
    Bla getBla() { 
     return null; 
    } 

    @Bean 
    BlubBlub getBlubBlub() { 
     return new BlubBlub(); 
    } 
} 

这将避免注入Bla实例,因为没有。 当你有很多@Injects时,这并不理想,但这是有效的。

另一个不理想的解决方案是让你的bean实现一个接口,并模拟接口而不是实现类。

我试过springockito,这将适用于你的情况,但在我的测试用例之一是测试一个自定义的BeanDefinitionRegistryPostProcessor,这是在思考正常的春季行为。