【发布时间】:2014-04-16 07:26:45
【问题描述】:
问题是:我有一个相当复杂的类B,其中定义了很多@Inject(其中有一个类C)。这个类的一个实例被注入到另一个我想要测试的类 A 中。
这个想法是我想将 B 类的模拟注入 A - 我希望它由 spring 注入,以便在实例之后执行 init 方法已创建(因此这里没有 @InjectMock 进行替代注入)。
Here's an example that is boiled down to three classes Bla, Blub and Blublub。我想要做的是模拟 Blub 并将这个实例注入 BlubBlub - 我想忽略 Bla 的存在。
*已编辑*
主要的一点是,我希望上下文由 Blub 类的模拟和 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 方法中显式调用 mock(Blub) 定义 Blub 的模拟时,当 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() 拉动 bean,它已经在上下文构造中转储)。
来自 Guice,我将我的模拟实例简单地绑定到模块中,一切都会好起来的。
非常感谢您的帮助 - 听起来像是一个标准问题,但我找不到简单的解决方案。
谢谢你,弗里克
【问题讨论】:
-
很遗憾这个没有回答,我也有同样的问题
-
看看stackoverflow.com/questions/41880210/… ,这帮助我解决了类似的问题
标签: java spring unit-testing dependency-injection mockito