java - 测试 Spring : Avoid injections into mocked objects with Mockito

标签 java spring unit-testing dependency-injection mockito

问题是:我有一个相当复杂的类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/

相关文章:

PHPUnit - 使用配置文件时出现 'No tests executed'

python-3.x - 如何模拟elasticsearch.helpers.bulk

java - 即使系统关闭后,Oracle Activity 和非 Activity session 仍然存在

java - JSF h :commandButton 的问题

java - 在Java中搜索和编辑ArrayList中的元素

java - Hystrix FallBack 不良实践

带有 DBUnit : initial fixture fails to set up 的 PHPUnit

java - 扩展 Gradle Java 插件的正确方法是什么?

spring - 如何使用 mvc Controller 中使用 @Scope ("session")保存的 jsp 页面中 session 变量的值

spring - 跨junit测试类重用spring应用程序上下文