Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何模拟bean并避免nonuniquebeandfinitionexception_Java_Spring_Spring Mvc - Fatal编程技术网

Java 如何模拟bean并避免nonuniquebeandfinitionexception

Java 如何模拟bean并避免nonuniquebeandfinitionexception,java,spring,spring-mvc,Java,Spring,Spring Mvc,我有一个基于SpringMVC的webApplication,所有bean都是通过注释定义的。今天我尝试为我的控制器编写测试。我放了第一个并试图模拟这个控制器中使用的服务。所有这些我都是通过以下方式完成的: 1) 为测试clientControllerTest-context.xml创建上下文文件 运行测试时,捕获了NoUniqueBeanDefinitionException例外。我希望spring覆盖BeanConnectionDB,但事实上它发现有两个bean有一个名称,spring无法选

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

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

运行测试时,捕获了NoUniqueBeanDefinitionException例外。我希望spring覆盖BeanConnectionDB,但事实上它发现有两个bean有一个名称,spring无法选择必须使用哪一个

请解释我如何使用我的主spring上下文并模拟其中一个bean来测试和避免NonuniqueBeandFinitionException(若可能的话)


注意:我认为为测试创建带有所有配置的上下文是一个坏主意,因此我尝试使用我的主spring上下文。

你可以为你的spring应用定义配置文件,并将你的
@configuration
类或
@Bean
方法(甚至你的自定义元注释,如果你使用的话)绑定到命名的配置文件上,如果需要,甚至可以使用多个配置文件。然后,您可以使用名称
test
development
production
或您想到的任何自定义场景来定义概要文件,并根据当前活动的概要文件将bean注册到Spring上下文中

测试
其他测试
配置文件定义bean,如下所示:

@Configuration
@Profile({"test", "anotherTest"})
public class SomeConfig {...}
或在xml文件中:

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

如果您想通过编程方式激活配置文件,请参阅关于如何在webapp或javadoc中默认激活配置文件的其他问题。

我更改了clientControllerTest-context.xml(模拟bean由以下注释包装并添加到我的测试中:@ActiveProfiles(profiles={“test”})。但这并不能解决问题,我看到了相同的例外。可能是因为我没有定义默认配置文件?但如何为通过注释定义的bean设置配置文件?您已将测试上下文bean定义为仅当“测试”配置文件处于活动状态时才处于活动状态,然后激活“测试”用于JUnit测试的配置文件。但是在应用程序上下文中仍然有“真正的ConnectionDB bean”,我想您还没有限制为一个配置文件。因此,您得到两个具有相同接口或名称的bean,Spring无法决定在自动连线中使用哪一个。您需要将“真正的ConnectionDB bean”限制为另一个配置文件(
production
maybe?)并在web应用程序上下文中激活该配置文件,如我上一段中链接的问题所示。
@Configuration
@Profile({"test", "anotherTest"})
public class SomeConfig {...}
...
<beans profile="test, anotherTest">
    <bean .../>
</beans>
...
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(...)
@ActiveProfiles({"test", "anotherTest"})