问题是:我有一个相当复杂的类B,其中定义了很多@Inject
(其中有一个类C) .这个类的一个实例被注入(inject)到另一个类 A 中,我想对其进行测试。
这个想法是我想将类 B 的模拟注入(inject) A - 我希望它由 spring 注入(inject)以在实例之后执行 init-method已创建(因此此处没有 @InjectMock
进行替代注入(inject))。
Here's an example that is boiled down to three classes Bla, Blub and Blublub .我想做的是模拟 Blub 并将此实例注入(inject) 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 的 mock 时,出现以下错误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,我会简单地将我的模拟实例绑定(bind)到模块中,一切都会好起来的。
非常感谢您的帮助 - 听起来像是一个标准问题,但我找不到简单的解决方案。
谢谢和问候,fricke
最佳答案
将您的配置更改为
@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)
}
}
Spring 提示的是应用程序上下文中没有 Bla 实现,因此无法执行注入(inject)
关于java - 测试 Spring : Avoid injections into mocked objects with Mockito,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22346823/