运行Arquillian集成测试时遭遇java.lang.NoSuchMethodError错误求助
解决Arquillian + Weld-EE嵌入式容器的JUnit版本冲突问题
看起来你遇到的NoSuchMethodError是典型的JUnit版本冲突导致的问题,下面详细分析并给出解决方案:
问题根源
错误信息里的org.junit.runners.model.TestClass.getAnnotatedFields()方法是在JUnit 4.12中才被引入的,而你配置的JUnit版本是4.11——这个版本根本没有这个方法。Arquillian 1.4.0.Final的JUnit容器适配器依赖的JUnit版本要求高于4.11,当测试运行时,类路径里同时存在Arquillian依赖的高版本JUnit类和你指定的4.11版本类,就会抛出这个找不到方法的错误。
解决方案
1. 升级JUnit版本到兼容版本
把你的JUnit依赖从4.11升级到4.12或更高的兼容版本(比如4.13.2),修改后的依赖配置如下:
compile group: 'org.jboss.arquillian', name: 'arquillian-bom', version: '1.4.0.Final', ext: 'pom' testCompile group: 'org.jboss.arquillian.junit', name: 'arquillian-junit-container', version: '1.4.0.Final' testCompile group: 'org.jboss.arquillian.container', name: 'arquillian-weld-ee-embedded-1.1', version: '1.0.0.Final' testCompile 'org.jboss.weld:weld-core:2.4.5.Final' testCompile group: 'junit', name: 'junit', version: '4.13.2'
2. 验证依赖树,排除冲突
如果你担心还有其他依赖传递引入旧版本JUnit,可以通过Gradle命令查看依赖树:
gradle dependencies --configuration testCompileClasspath
如果发现有其他依赖引入了JUnit 4.11,在对应的依赖上添加排除配置,比如:
testCompile('some-other-dependency') { exclude group: 'junit', module: 'junit' }
3. 确保Arquillian BOM管理所有相关依赖
你已经引入了Arquillian的BOM,它会帮你管理Arquillian相关组件的版本兼容性,建议保持BOM的版本和其他Arquillian依赖版本一致(你现在已经做到了,都是1.4.0.Final),这样能减少版本冲突的概率。
验证测试
修改完依赖后,重新运行gradle clean test,应该就能正常启动Weld-EE嵌入式容器并执行测试了。你的测试代码本身没有问题,即使不注入Bean也能正常运行,问题完全出在依赖版本的不兼容上。
内容的提问来源于stack exchange,提问作者Toumi
相关产品推荐
相关产品推荐

