我正在努力解决一个奇怪的问题,因为我们已经开始进行集成测试,因此我的项目已经出现了。发生的事情是我使用“jetty-maven-plugin”来启动应用程序的实例,一旦它启动,“maven-failsafe-plugin”开始运行集成测试。设置和运行良好。
我现在要做的是:我想要处理我的服务层,以便我可以为我的测试设置一些灯具来运行。到目前为止,我们的集成测试非常简单,我想把它变成一个档次并测试实际填写表格等等。为此,我需要能够设置一些灯具,然后将它们移除,以便这些测试可以重现。我们正在针对我们用于此目的的测试数据库运行。
从我读过的内容来看,这并非不合理。尽管如此,当我实际运行测试时,我得到一个非常奇怪的错误消息和堆栈跟踪。据我所知,Maven在没有问题的情况下在Jetty中启动应用程序。然后,failsafe插件开始运行测试,一旦它遇到第一次集成测试,它就开始实例化一个Spring实例和上下文。它正确地提取了它的属性和配置文件,但是当它试图实际注入服务对象时,我看到了这个错误:
引起:org.springframework.beans.factory.BeanDefinitionSt oreException:从类中解析XML文档时发生意外异常 路径资源[app-config.xml];嵌套异常是 org.springframework.context.annotation.Conflicting BeanDefinitionException:注释指定的bean名称 'beansideRoleRepositoryImpl'用于bean类 [dao.role.PesticideRoleRepositoryImpl]与现有的冲突, 同名和类的非兼容bean定义 [dao.role.PesticideRoleRepositoryImpl]
我将为您提供所有堆栈跟踪,我可以随时使用它。 ; - )
我开始想知道我是否会这样做,所以我回去以同样的方式设置了一个测试项目。测试项目简单得多,没有这个问题。当它运行集成测试时,服务对象被注入而没有问题。如果您有兴趣,可以查看my test project on GitHub。
我的问题是这个......
之前有没有人见过这个错误?可能有一些条件下Spring会遇到这种问题吗?
我很清楚,通过这种集成测试,我最终得到了两个使用完全相同配置的Spring容器。我认为这可能是问题,但测试项目的工作方式相同,没有这个问题。我也为这样的事实感到困扰,即使有两个具有相同名称和类的bean,Spring认为它们是不兼容的。
谢谢,任何帮助将不胜感激! :-D
答案 0 :(得分:0)
当两个不同的文件包含相同的类(bean)定义且不兼容时,会发生此错误,即oldBeanDefintion.equals(newBeanDefinition) == false
您可以查看:
您可以在ClassPathBeanDefinitionScanner.isCompatible()
或扩展ClassPathBeanDefinitionScanner
上设置一个断点并覆盖isCompatible
方法并记录一些有用的信息以查找错误。
作为最后一个选项,XML BeanDefinitions
不能被扫描的那些覆盖,因此如果您用XML定义bean,将忽略具有相同bean名称的扫描的clases。
答案 1 :(得分:0)
选择的答案是正确的,根问题是创建了多个bean实例。但有趣的是,其他实例是模拟实例;他们被捡起来是因为他们和测试混在一起,所有的测试都放在了类路径中。
可能有很多解决方案,我的修复方法是在我的应用程序配置中将“context:exclude-filter”添加到“context:component-scan”声明中。