gpt4 book ai didi

java - 如何模拟 bean 并避免 NoUniqueBeanDefinitionException

转载 作者:行者123 更新时间:2023-11-30 06:11:00 25 4
gpt4 key购买 nike

我有基于 SpringMVC 的 webApplication,所有 bean 都是通过注解定义的。今天我尝试为我的 Controller 编写测试。我放了第一个并尝试模拟此 Controller 中使用的服务。我通过以下方式完成的所有这些:

1) 为测试创建上下文文件 clientControllerTest-context.xml

<import resource="classpath:spring-context.xml" />

<bean id="ConnectionDB" name="ConnectionDB" class="org.mockito.Mockito" factory-method="mock">
<constructor-arg value="biz.podoliako.carwash.services.impl.ConnectDB" />
</bean>

其中 spring-context.xml 是我的 webApplication 中使用的主要上下文文件(包括有关真实 ConnectionDB bean 的信息)

2)使用以下配置创建测试类

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:controllers/clientControllerTest-context.xml"})
@WebAppConfiguration

当测试运行时,捕获了 NoUniqueBeanDefinitionException 异常。我希望 spring 覆盖 bean ConnectionDB,但实际上它找到了 2 个同名的 bean,而 spring 无法选择必须使用哪一个。

请解释一下我如何使用我的主 spring-context 和模拟其中一个 bean 来测试和避免 NoUniqueBeanDefinitionException(如果可能的话)。

注意:我认为为测试创建包含所有配置的上下文不是一个好主意,因此我尝试使用我的主 spring-context。

最佳答案

您可以为您的 Spring 应用程序定义 profiles,并绑定(bind)您的 @Configuration 类或 @Bean 方法(甚至您的自定义元-注释,如果你使用的话)到命名的配置文件,如果你愿意的话,甚至可以是多个配置文件。然后你可以定义名称为 testdevelopmentproduction 或任何你想到的自定义场景的配置文件,并将你的 bean 注册到你的 Spring基于当前 Activity 配置文件的上下文。

像这样为 testanotherTest 配置文件定义 bean:

@Configuration
@Profile({"test", "anotherTest"})
public class SomeConfig {...}

或者在 xml 文件中:

...
<beans profile="test, anotherTest">
<bean .../>
</beans>
...

以类似的方式定义您的production 受限bean,以避免配置文件中的bean 冲突。然后,在您的 JUnit 测试类上使用 @ActiveProfiles 注释来指示您希望在运行测试时激活哪些配置文件:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(...)
@ActiveProfiles({"test", "anotherTest"})

请参阅其他问题 Default profile in Spring 3.1关于如何在 webapp 或 javadoc 中默认激活配置文件 org.springframework.core.env.Environment如果您想以编程方式进行。

关于java - 如何模拟 bean 并避免 NoUniqueBeanDefinitionException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34844604/

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