0

我正在努力解决我的项目中出现的一个奇怪问题,该问题自从我们开始进行集成测试以来就出现了。发生的事情是我使用“jetty-maven-plugin”启动应用程序的一个实例,一旦它启动,“maven-failsafe-plugin”就开始运行集成测试。这么多设置和运行良好。

我现在要做的是:我想处理我的服务层,以便我可以设置一些固定装置供我的测试运行。到目前为止,我们的集成测试非常简单,我想把它提高一个档次并测试实际填写表格等等。为此,我需要能够设置一些固定装置,然后将它们移除,以便这些测试可重现。我们正在针对我们用于此目的的测试数据库运行。

从我所读到的,这并非不合理。尽管如此,当我实际运行测试时,我会收到一条非常奇怪的错误消息和堆栈跟踪。据我所知,Maven 在 Jetty 中启动应用程序没有问题。然后故障安全插件开始运行测试,一旦它达到第一个集成测试,它就开始实例化一个 Spring 实例和上下文。它正确地提取了它的属性和配置文件,但是当它尝试实际注入服务对象时,我看到了这个错误:

引起:org.springframework.beans.factory.BeanDefinitionSt oreException:从类路径资源[app-config.xml]解析XML文档时出现意外异常;嵌套异常是 org.springframework.context.annotation.Conflicting BeanDefinitionException: Annotation-specified bean name 'pesticideRoleRepositoryImpl' for bean class [dao.role.PesticideRoleRepositoryImpl] 与同名和类 [dao.role] 的现有不兼容 bean 定义冲突.PesticideRoleRepositoryImpl]

我会为你省去所有的堆栈跟踪,我可以随时提供它。;-)

我开始怀疑我是否做错了,所以我回去以几乎相同的方式设置一个测试项目。测试项目要简单得多,没有这个问题。当它运行集成测试时,服务对象会毫无问题地注入。有兴趣的可以看看我在 GitHub 上的测试项目

我的问题是这个...

有没有人见过这个错误?会不会在某些情况下Spring会出现这种问题呢?

我很清楚,通过这种集成测试,我最终得到了两个使用完全相同配置的 Spring 容器。我认为这可能是问题,但测试项目的工作方式相同并且没有这个问题。我也很困扰,即使有两个具有相同名称和类的 bean,Spring 仍然认为它们是不兼容的。

谢谢,任何帮助将不胜感激!:-D

4

2 回答 2

0

当两个不同的文件包含相同的类(bean)定义并且不兼容时会发生此错误,即oldBeanDefintion.equals(newBeanDefinition) == false

你可以检查:

  • 为什么扫描仪加载这个类两次。
  • 为什么 oldBeanDefinition.getSource().equals(newBeanDefinition.getSource()) = false
  • 为什么 oldBeanDefinition.equals(newBeanDefinition) = false

您可以在方法上设置断点ClassPathBeanDefinitionScanner.isCompatible()或扩展ClassPathBeanDefinitionScanner和覆盖isCompatible方法并记录一些有用的信息以查找错误。

作为最后一个选项,XMLBeanDefinitions不能被扫描的类覆盖,因此如果您在 XML 中定义 bean,则具有相同 bean 名称的扫描类将被忽略。

于 2013-03-23T21:00:56.213 回答
0

选择的答案是正确的,根本问题是正在创建 bean 的多个实例。不过,有趣的是其他实例是模拟实例。之所以选择它们,是因为它们与测试混在一起,并且所有测试都放在类路径中。

可能有很多解决方案,我的解决方法是在我的应用程序配置中的“context:component-scan”声明中添加“context:exclude-filter”。

于 2013-04-01T18:34:28.107 回答