java.lang.NoSuchMethodError:在类中添加构造函数后

时间:2018-12-29 07:47:30

标签: java intellij-idea

有人可以帮我理解为什么将新的构造函数添加到带有两个参数的类中之后,为什么项目可以编译,但是我的测试现在无法创建该类的新实例?

我收到此异常:

  

java.lang.NoSuchMethodError:   pidac.workflow.TestClass。(Lcom / pidac / infrastructure / core / service / CrudService; Lcom / pidac / infrastructure / core / service / AuditService;)V

     在

  pidac.workflow.SomeTests.shouldAuditCompletedIdentityRequestItemsAgainstConnectedSources(SomeClass.java:115)     在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处   sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)     在   sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)     在java.lang.reflect.Method.invoke(Method.java:498)在   org.junit.runners.model.FrameworkMethod $ 1.runReflectiveCall(FrameworkMethod.java:50)     在   org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)     在   org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)     在   org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)     在   org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)     在org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)处   org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)     在   org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)     在org.junit.runners.ParentRunner处$ 3.run(ParentRunner.java:290)在   org.junit.runners.ParentRunner $ 1.schedule(ParentRunner.java:71)在   org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)在   org.junit.runners.ParentRunner.access $ 000(ParentRunner.java:58)在   org.junit.runners.ParentRunner $ 2.evaluate(ParentRunner.java:268)在   org.junit.runners.ParentRunner.run(ParentRunner.java:363)在   org.junit.runner.JUnitCore.run(JUnitCore.java:137)在   com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)     在   com.intellij.rt.execution.junit.IdeaTestRunner $ Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)     在   com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)     在   com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)

我正在使用IntelliJ 2018 Professional。

12月29日的更多信息: 我已经删除了该项目的Maven本地快照并进行了重建。

调试测试时,可以看到该类具有此新构造函数。但是,调试器正在执行的内容与我在IntelliJ中看到的内容之间显然不匹配。

3 个答案:

答案 0 :(得分:0)

当您声明带有2个args的类时,您的类将丢失其默认构造函数(无args)。您正在编写的测试可能期望默认构造函数获取实例。

构建另一个显式的无参数构造函数,或者如果您使用的是出色的Lombok库,请使用@NoArgsConstructor注释该类,以使测试正常进行。或者,更改测试以在构造函数中使用2个属性初始化该类。

尼古拉斯(Nicholas)提到,您的代码示例会有所帮助。

此处的另一个SO问题中说明了默认构造函数:Java default constructor

答案 1 :(得分:0)

当在编译时存在的方法在运行时不再存在时,会发生NoSuchMethodError。

您编译的类文件已过期。重建您的项目。

答案 2 :(得分:0)

我必须手动删除[module]/out/production/classes中当前配置的gradle输出文件夹。

我的项目为此输出配置了此文件夹,因此当我查看其中的已编译类时,新的更改未反映出来。因此,我认为这些已编译的类没有被更新,只是删除了它们。

重新组装项目,即使我在上面的位置看不到编译的类,我的测试现在也可以看到更改。...