当前位置: 首页 > 知识库问答 >
问题:

在运行我的cucumber自动化时获得NoClassDefFoundError

梁和颂
2023-03-14

在运行自动化时,我面临以下问题。这就是我在控制台上看到的。

伊奥。cucumber果心例外cucumber例外:爪哇。lang.NoClassDefFoundError:io/cucumber/messages/internal/com/google/protobuf/GeneratedMessageV3

at io.cucumber.core.plugin.PluginFactory.newInstance(PluginFactory.java:120)
at io.cucumber.core.plugin.PluginFactory.instantiate(PluginFactory.java:99)
at io.cucumber.core.plugin.PluginFactory.create(PluginFactory.java:63)
at io.cucumber.core.plugin.Plugins.createPlugins(Plugins.java:32)
at io.cucumber.core.plugin.Plugins.<init>(Plugins.java:25)
at io.cucumber.testng.TestNGCucumberRunner.<init>(TestNGCucumberRunner.java:108)
at io.cucumber.testng.AbstractTestNGCucumberTests.setUpClass(AbstractTestNGCucumberTests.java:27)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:133)
at org.testng.internal.MethodInvocationHelper.invokeMethodConsideringTimeout(MethodInvocationHelper.java:62)
at org.testng.internal.ConfigInvoker.invokeConfigurationMethod(ConfigInvoker.java:385)
at org.testng.internal.ConfigInvoker.invokeConfigurations(ConfigInvoker.java:321)
at org.testng.internal.TestMethodWorker.invokeBeforeClassMethods(TestMethodWorker.java:176)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:122)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
at org.testng.TestRunner.privateRun(TestRunner.java:794)
at org.testng.TestRunner.run(TestRunner.java:596)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:377)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:371)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:332)
at org.testng.SuiteRunner.run(SuiteRunner.java:276)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:53)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:96)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1212)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1134)
at org.testng.TestNG.runSuites(TestNG.java:1063)
at org.testng.TestNG.run(TestNG.java:1031)
at com.intellij.rt.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:66)
at com.intellij.rt.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:109)

造成原因:java.lang.NoClassDefFoundError: io/cucumber/消息/内部/com/google/原型/GeneratedMessageV3在com.aventstack.extentreports.cucumber.adapter.ExentCucumberAdapter.(扩展CucumberAdapter.java:91)在java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(本地方法)在java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)在java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance在java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)io.cucumber.core.plugin.PluginFactory.new实例(PluginFactory.java:116)-plhd--17/>$AppClassLoader.load类(ClassLoaders.java:178)at java. base/java. lang.ClassLoader. loadClass(ClassLoader. java: 522)...37 more

共有3个答案

盖马鲁
2023-03-14

嗨,当cucumber7出来的时候,我也遇到了同样的问题,就在今天,我能够解决它,基本上我所做的就是更新一些其他可能受到cucumber版本影响的框架的版本(在我的pom.xmlfile)。这些是我在稳定版本中使用的框架:

<dependencies>
        <dependency>
            <groupId>io.cucumber</groupId>
            <artifactId>cucumber-java</artifactId>
            <version>7.0.0</version>
        </dependency>

        <dependency>
            <groupId>io.cucumber</groupId>
            <artifactId>cucumber-testng</artifactId>
            <version>7.0.0</version>
        </dependency>

        <dependency>
            <groupId>io.cucumber</groupId>
            <artifactId>cucumber-junit</artifactId>
            <version>7.0.0</version>
        </dependency>

        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>7.4.0</version>
        </dependency>

        <dependency>
            <groupId>com.aventstack</groupId>
            <artifactId>extentreports</artifactId>
            <version>5.0.8</version>
        </dependency>

        <dependency>
            <groupId>com.aventstack</groupId>
            <artifactId>klov-reporter</artifactId>
            <version>5.0.8</version>
        </dependency>

        <dependency>
            <groupId>tech.grasshopper</groupId>
            <artifactId>extent-pdf-report</artifactId>
            <version>1.7.3</version>
        </dependency>

        <dependency>
            <groupId>tech.grasshopper</groupId>
            <artifactId>extentreports-cucumber7-adapter</artifactId>
            <version>1.1.0</version>
        </dependency>

        <dependency>
            <groupId>io.qameta.allure</groupId>
            <artifactId>allure-cucumber7-jvm</artifactId>
            <version>2.17.2</version>
        </dependency>

我希望这有助于解决你的问题,最好的问候!

山煜祺
2023-03-14

要找出加载了哪个类(哪些没有),请在详细模式下运行Java,但仅限于类加载,如下所示:

java -verbose:class ...

从这个输出中,您应该能够确定丢失了哪个类。如果您再次查看GeneratedMessageV3,请尝试查看该类的源代码。可能是某个静态初始值设定项抛出了一个异常,该异常只是告诉JVM该类无法成功加载。

尤祖鹤
2023-03-14

啊,这是一个棘手的问题。从插件工厂堆栈跟踪,我猜它是由以下原因引起的:您有一个包含步骤绑定的类(例如,给定我登录)。要创建这个类,您需要Specflow向构造函数中注入一些类(依赖注入)。如果该类在另一个项目中,但StepALL(见specflow.json或app.config)或项目引用不正确,则可能会发生这种情况。请参见代码示例(不幸的是,C#,但这一点应该很清楚)

[Binding]
public class Test{
   public Test(ThisClassNotInAssembly getMe){
     getMe.SomeFunction();
   }
}

另一个选项是,一个步骤需要一个转换(从字符串到MyNotDependency类)。同样,该类位于另一个项目中,并且在运行时依赖性失败。

 类似资料: