gpt4 book ai didi

java - 模拟 bean 的依赖项的 NoSuchBeanDefinitionException

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:52:33 32 4
gpt4 key购买 nike

我正尝试在我的集成测试中使用模拟,但运气不佳。我使用的是Spring 3.1.1和Mockito 1.9.0,情况如下:

@Component
public class ClassToTest {

@Resource
private Dependency dependency;

}

@Component
public class Dependency {

@Resource
private NestedDependency nestedDependency;

}

现在,我想使用 Spring 的 JavaConfig 对 ClassToTest 进行集成测试。这是我尝试过的,但它不起作用:

@Test
@ContextConfiguration
public class ClassToTestIntegrationTest {

@Resource
private ClassToTest classToTest;

@Resource
private Dependency mockDependency;

@Test
public void someTest() {
verify(mockDependency).doStuff();

// other Mockito magic...

}


@Configuration
static class Config {

@Bean
public ClassToTest classToTest() {
return new ClassToTest();
}

@Bean
public Dependency dependency() {
return Mockito.mock(Dependency.class);
}

}
}

我简化了我的设置,使问题更容易理解。实际上,我有更多依赖项,只想模拟其中的一些 - 其他依赖项是真实的,基于从我的产品 @Configuration 类导入的配置。

最终发生的事情是我得到一个 NoSuchBeanDefinitionException 说在应用程序上下文中没有类型为 NestedDependency 的 bean。我不明白这一点——我认为 Spring 会收到 Mockito 的模拟依赖实例,甚至不会考虑 Autowiring 它。由于这行不通,我最终不得不模拟我的整个对象图——这完全违背了模拟的意义!

在此先感谢您的帮助!

最佳答案

我遇到了同样的问题,我找到了另一个解决方案。当 Spring 实例化所有 bean 时,它将检查它是否是 Mockito Mock,在这种情况下,我为注入(inject)属性返回 false。要使用它,只需将它注入(inject)到 Spring 上下文中

代码如下:

public class MockBeanFactory extends InstantiationAwareBeanPostProcessorAdapter {

private static final MockUtil mockUtil = new MockUtil();

public MockBeanFactory() {
super();
}

@Override
public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
return !mockUtil.isMock(bean);
}

}

关于java - 模拟 bean 的依赖项的 NoSuchBeanDefinitionException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10092808/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com