Java.lang.NoSuchMethodError: после добавления конструктора в класс

Может ли кто-нибудь помочь мне понять, почему после добавления нового конструктора в класс, который принимает два параметра, проект компилируется, но теперь мой тест не может создать новый экземпляр этого класса?

Я получаю это исключение:

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

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

Я использую IntelliJ 2018 professional.

Подробнее 29 декабря: Я удалил локальный снимок maven для этого проекта и перестроил.

Когда я отлаживаю тест, я вижу, что у класса есть этот новый конструктор. Однако очевидно несоответствие между тем, что выполняет отладчик, и тем, что я вижу в IntelliJ.

Не могли бы вы поделиться своим кодом?

Nicholas K 29.12.2018 08:49

Я не могу поделиться кодом. Однако проблема, как объяснено, в точном представлении проблемы. Мне нужно выяснить, откуда IntelliJ запускает свои тесты.

Klaus Nji 29.12.2018 17:02
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
2
925
3

Ответы 3

Ваш класс теряет свой конструктор по умолчанию (без аргументов), когда вы объявляете конструктор с двумя аргументами. Тест, который вы пишете, вероятно, ожидает, что конструктор по умолчанию получит экземпляр.

Создайте еще один явный конструктор без аргументов или, если вы используете отличную библиотеку Lombok, аннотируйте класс с помощью @NoArgsConstructor, чтобы ваши тесты работали. В качестве альтернативы измените свой тест, чтобы инициализировать класс с двумя атрибутами в конструкторе.

Как упомянул Николас, вам поможет пример кода.

Конструктор по умолчанию объясняется в другом вопросе SO здесь: Конструктор по умолчанию Java

Конструктор по умолчанию не был удален.

Klaus Nji 29.12.2018 16:56

NoSuchMethodError возникает, когда метод, который присутствовал во время компиляции, больше не присутствует во время выполнения.

Ваши скомпилированные файлы классов устарели. Восстановите свой проект.

Я выполнил чистую сборку-установку для всего решения. Кроме того, мои тесты находятся в том же проекте (модуле), что и исходный код. Мы используем соглашение Maven, которое, судя по моему опыту, не требует перестройки проекта.

Klaus Nji 29.12.2018 16:55

Мне пришлось вручную удалить папку вывода gradle, которая в настоящее время настроена в [module]/out/production/classes.

В моем проекте эта папка настроена для вывода, поэтому, когда я посмотрел на скомпилированные классы, новые изменения не были отражены. Поэтому я решил, что эти скомпилированные классы не обновляются, и просто удалил их.

Пересобранный проект, и мои тесты теперь могут видеть изменения, хотя я не вижу скомпилированные классы в расположении выше ....

Другие вопросы по теме