gpt4 book ai didi

java - 在没有xml的情况下将mock注入(inject)Spring容器进行测试

转载 作者:行者123 更新时间:2023-12-04 06:26:57 25 4
gpt4 key购买 nike

目前,我使用@Autowired、@Component、@Resource 等连接了我的 Spring 应用程序。现在我想编写一个测试,该测试需要模拟系统中的特定对象,但保留剩余对象的实际生产连接。

假设正在测试的根对象称为 Foo。在依赖链的更深处,Foo 依赖于 Bar。目前为了模拟这个对象,我创建了一个 test-applicationContext.xml,它只有一个 bean 条目:

<bean id="bar" class="org.mockito.Mockito" factory-method="mock"> 
<constructor-arg value="com.package.Bar" />
</bean>

test-applicationContext.xml 在 @ContextConfiguration 注释中声明,因此 Foo 最终将依赖于模拟的 Bar 对象。

不需要这个 test-applicationContext.xml 是否可以获得相同的结果?即做同样的事情但程序化?

所以在伪代码中,我想知道我是否可以有类似的东西:
public class MyTest {

@Test
public void simple() {
// create mock Bar object
// register mock Bar object in container
// resolve Foo object with all its dependencies but use the mock Bar object instead of the real one
// set some expectations on the Bar object
// call some method on Foo
}
}

最佳答案

您必须避免在单元测试中启动 Spring 上下文。仅在检查属性注入(inject)和其他 Spring 特性的测试中使用 Spring 上下文。然后,您将能够以编程方式创建模拟对象。

虽然,它可以通过以下方式完成:

  BeanDefinitionRegistry registry = ((BeanDefinitionRegistry )factory);

GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
beanDefinition.setBeanClass(MyBeanClass.class);
beanDefinition.setLazyInit(false);
beanDefinition.setAbstract(false);
beanDefinition.setAutowireCandidate(true);
beanDefinition.setScope("session");

registry.registerBeanDefinition("dynamicBean",beanDefinition);

只需将您的 BeanFactory 注入(inject)您的 JUnit 即可获得工厂

关于java - 在没有xml的情况下将mock注入(inject)Spring容器进行测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5935086/

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