运行基于Serenity-JBehave的测试时遭遇ClassCastException异常
这个java.lang.ClassCastException: java.base/[Ljava.lang.Object; cannot be cast to [Lorg.jbehave.core.reporters.Format;错误,本质是Serenity JBehave在初始化配置时,把Object数组强行转换成Format数组失败了,大概率是依赖版本不兼容或者默认配置的逻辑出了问题。咱们可以从这几个方向来解决:
1. 锁定兼容的依赖版本
Serenity JBehave和JBehave的版本绑定很严格,版本不匹配很容易触发这类类型转换错误。比如Serenity JBehave 3.x系列需要搭配JBehave 4.x版本,如果你用了旧版JBehave或者最新版但没对应上Serenity的版本,就会出问题。
举个Maven的配置例子,你可以直接在pom.xml里指定兼容的版本组合:
<dependencies> <!-- Serenity JBehave核心依赖 --> <dependency> <groupId>net.serenity-bdd</groupId> <artifactId>serenity-jbehave</artifactId> <version>3.9.0</version> <scope>test</scope> </dependency> <!-- 对应兼容的JBehave版本 --> <dependency> <groupId>org.jbehave</groupId> <artifactId>jbehave-core</artifactId> <version>4.8.3</version> <scope>test</scope> </dependency> </dependencies>
Gradle用户可以对应调整build.gradle里的依赖声明。
2. 重写配置方法,手动指定Format
默认的defaultConfiguration方法可能在处理Format数组时出了问题,咱们可以自己重写这个方法,手动传入明确的Format枚举值,绕过自动转换的坑。
比如在你的测试类(继承SerenityStories的类)里这么写:
import org.jbehave.core.configuration.Configuration; import org.jbehave.core.reporters.Format; import org.jbehave.core.reporters.StoryReporterBuilder; import net.serenitybdd.jbehave.SerenityStories; public class YourStoryTests extends SerenityStories { @Override protected Configuration defaultConfiguration() { // 调用父类配置,然后手动指定报告格式 return super.defaultConfiguration() .useStoryReporterBuilder(new StoryReporterBuilder() .withFormats(Format.CONSOLE, Format.HTML)); } }
这里直接把需要的Format类型传进去,就不会出现Object转Format数组的问题了。
3. 排查并清理依赖冲突
有时候项目里会引入多个版本的JBehave或者Serenity相关依赖,导致类加载时出现版本不一致的问题。你可以用Maven的命令查看依赖树:
mvn dependency:tree
或者Gradle的:
./gradlew dependencies
找到重复或者冲突的依赖后,用<exclusions>(Maven)或者exclude(Gradle)把不兼容的版本排除掉。
如果以上方法都没解决,建议直接把Serenity JBehave升级到最新的稳定版本,官方通常会在新版本里修复这类兼容性问题。
内容的提问来源于stack exchange,提问作者RJM

